1

パラメータとしてプロパティのリストを介して匿名型を選択することは可能ですか。メソッドは次のようになります。

public void TestLinq(List<"Properties"> properties, List<Data> data)
{
    var dat = from d in data select new { properties };
}

説明が不器用に聞こえることは承知していますが、助けていただければ幸いです。

このトピックを探すために必要な用語を知ることは重要です。

4

4 に答える 4

1

ほら、これはこの回答に基づいていますhttps://stackoverflow.com/a/5310828/491950

List<string> properties = new List<string>() { {"ResultPrefix"}, {"ProfileResult"}};

foreach (dynamic d in ListProperties(properties, cellValues))
{
     Console.WriteLine(d.ResultPrefix);
}


public static List<dynamic> ListProperties(List<string> properties, List<ChemistryResult> chemistryResults)
{
    List<dynamic> output = new List<dynamic>();

    foreach (ChemistryResult chemistryResult in chemistryResults)
    {
        IDictionary<string, Object> result = new ExpandoObject();

        foreach (string property in properties)
        {
            PropertyInfo propertyInfo = typeof(ChemistryResult).GetProperty(property);

            result[property] = propertyInfo.GetValue(chemistryResult);
        }

        output.Add(result);
    }

    return output;
}
于 2012-12-04T21:37:27.760 に答える
1

次のように、Dynamic LINQ クエリ ライブラリ(サンプルをダウンロード) を使用して、プロジェクション内のプロパティのリストを作成できます。

public dynamic TestLinq(IEnumerable<Data> data, IEnumerable<string> properties)
{
    // Validate parameters.
    if (properties == null) throw new ArgumentNullException("properties");
    if (data == null) throw new ArgumentNullException("data");

    // Construct the field list.
    var fields = new StringBuilder();
    foreach (string p in properties) fields.AppendFormat("{0},", property);

    // Throw an exception if there are no items.
    if (fields.Length == 0) throw new ArgumentException(
        "The properties enumeration contains no elements.", "properties");

    // Remove the last comma.
    fields.Length--;

    // Select the items and return.  Create the
    // projection here.
    return data.Select("new(" + fields + ")");
}

戻り値の型は typedynamicであるため、コンパイル時のチェックは行われないことに注意してください。ダックタイピングしない限り、おそらくフィールドの知識はあまりありません。

必要に応じて、これには強力な型を作成する方よい場合があります (これがユーザー入力に基づいている場合は、明らかにできません)。

于 2012-12-04T21:24:30.030 に答える
0

メソッド シグネチャで匿名型を使用することはできません。パラメーターまたは戻り値の型として使用することはできません。

あなたができることは、パラメータを として宣言することですがdynamic、動的は非常に粘着性になる可能性があるため、避けることをお勧めします。パラメーターを指定すると、その型のメンバーにアクセスできList<dynamic>ますが、コンパイル時に型チェックを行うことはできません。

IEnumerableまたはを使用する別のオプションIList。これらのいずれかを使用すると、型を知らなくてもコレクションのメンバーにアクセスできます。コンパイル時のすべてのチェックがあるため、これはより安全ですが、メンバーまたは匿名型にアクセスすることはできません。

しかし実際には、匿名型を実際のクラスに変換するだけで、作業が楽になります。

于 2012-12-04T21:24:28.017 に答える
0

混乱して申し訳ありません。結果は正しい csv になるはずです。ユーザーは、列の順序を定義できる必要があります。しかし、私にとって、良い質問を作成することは非常に困難でした。リフレクションではなく式を使用したソリューションを探しています。私のアイデアは、匿名オブジェクトのリストを (正しい順序で) 生成し、それらから csv を作成することでした。だから私は以下が機能していることを知っています:

public void Get(List<Value> data,Expression<Func<Value, T>> converter)
{
    var dat = from d in data
     select
         new
         {
               converter
         };
}

Expression> コンバーターをプロパティで保護し、それらの多くを 1 つに結合することは可能ですか? だから私は正しい順序を得るでしょう

于 2012-12-05T15:08:15.070 に答える