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

我喜欢 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 回答