13

匿名クラスのインスタンスがあるとします

var foo = new { A = 1, B = 2};

NameValueCollection を生成する簡単な方法はありますか? 匿名型のプロパティを事前に知らなくても、以下のコードと同じ結果を達成したいと考えています。

NameValueCollection formFields = new NameValueCollection();
formFields["A"] = 1;
formFields["B"] = 2;
4

4 に答える 4

29
var foo = new { A = 1, B = 2 };

NameValueCollection formFields = new NameValueCollection();

foo.GetType().GetProperties()
    .ToList()
    .ForEach(pi => formFields.Add(pi.Name, pi.GetValue(foo, null)?.ToString()));
于 2010-05-15T00:26:38.777 に答える
5

静的Array.ForEachメソッドを使用してプロパティをループする別の (マイナーな) バリエーション...

var foo = new { A = 1, B = 2 };

var formFields = new NameValueCollection();
Array.ForEach(foo.GetType().GetProperties(),
    pi => formFields.Add(pi.Name, pi.GetValue(foo, null).ToString()));
于 2010-05-15T06:41:45.627 に答える
3

あなたが望むものについて:

Dictionary<string, object> dict = 
       foo.GetType()
          .GetProperties()
          .ToDictionary(pi => pi.Name, pi => pi.GetValue(foo, null));

NameValueCollection nvc = new NameValueCollection();
foreach (KeyValuePair<string, object> item in dict)
{
   nvc.Add(item.Key, item.Value.ToString());
}
于 2010-05-15T00:24:40.663 に答える
1

Null をチェックするために 1 つの微調整を加えた Yurity の回答が気に入っています。

var foo = new { A = 1, B = 2 };

NameValueCollection formFields = new NameValueCollection();

foo.GetType().GetProperties()
 .ToList()
 .ForEach(pi => formFields.Add(pi.Name, (pi.GetValue(foo, null) ?? "").ToString()));
于 2014-09-22T19:50:48.973 に答える