2

まず、私は .net、匿名型、および LINQ に少し慣れていないため、これについてかなり外れている場合はご容赦ください。率直に言って、私は少し苦労しており、このトピックについて来月にかけて多くのことを学ぶ予定です. 私が思いついたことが正しい方法ではないことを十分に知っています。

私は、以前から存在していた標準レポート フィードから派生するさまざまな区切り出力形式を作成するプロジェクトを与えられました。このためのフレームワークはすでに用意されており、私は単純にフォーマットを追加し、いくつかの新しい出力メカニズムを追加しています。(以下の詳細の一部は無関係である可能性がありますが、わかりやすくするために含めます。)

データ層からのクエリは、LLBLGEN TypedList を返します。次に、LINQ クエリを適用してさまざまなフィード出力形式を作成し、IEnumerable 匿名オブジェクトを生成します。プロジェクトの一環として、そのオブジェクトを取得し、カンマ区切りのファイルとして出力します。

以下の例と他のいくつかの例を確認することで、機能する関数をまとめることができましたが、タスクを達成するための正しい方法ではないと確信しています (リフレクションを使用するなど)。そうは言っても、「正しい方法」は私を逃れます!正しい方向へのポインターでさえ、非常に役立ちます。

c#で匿名型をキー/値配列に変換しますか?

値が C# の匿名型であるディクショナリ

Private Sub SendExport(feed As IEnumerable, filename As String)

    Dim delimited As New StringBuilder

    Dim type = feed(0).GetType
    Dim props = type.GetProperties
    delimited.AppendLine(String.Join(",", props.Select(Function(p) p.Name).ToList))

    For Each item In feed
        Dim itemType = item.GetType
        Dim typeProps = itemType.GetProperties
        delimited.AppendLine(String.Join(",", typeProps.Select(Function(p) p.GetValue(item)).ToList))
    Next

    Debug.WriteLine(delimited.ToString)

    Response.Clear()

    Response.AddHeader("Cache-Control", "must-revalidate")
    Response.AddHeader("Pragma", "must-revalidate")
    Response.AddHeader("Content-type", "application/vnd.ms-excel")
    Response.AddHeader("Content-disposition", String.Format("attachment; filename={0}.csv", filename))
    Response.Write(delimited.ToString)
    Response.End()

End Sub
4

2 に答える 2

0

私はVBの専門家ではありませんが、ループから次の行を削除できると思います。

Dim itemType = item.GetType
Dim typeProps = itemType.GetProperties

そして、単にpropsリストを再利用します。

For Each item In feed
    delimited.AppendLine(String.Join(",", props.Select(Function(p) p.GetValue(item)).ToList))
Next
于 2012-11-13T21:12:15.760 に答える
0

この質問はかなり古いものですが、次の人を助けるために、私は自分の学習と研究で最終的に得た答えを提供すると思いました。

要するに、非常に簡単に言えば、ティム・シュメルターは私の最初の要求に対する彼のコメントの中でそれを正しく持っていました:

メソッドのスコープ外に匿名型を渡したり、直接使用したり、最初から別の型を使用したりしないでください。

私が達成しようとしていたことは、設計の観点からは根本的に正しくなく、基本的に匿名タイプの誤用でした。私の場合の正しい「答え」は、レポート層を単純にリファクタリングして、強く型付けされたクラスを全面的に使用することでした。LINQクエリは、クラスに直接入力するなどです。比較的簡単な作業で、最終的には非常にクリーンになりました。

于 2013-01-14T22:39:20.110 に答える