如何将匿名类型的实例转换为NameValueCollection

时间:2010-05-15 00:18:46

标签: c# anonymous-types

假设我有一个匿名类实例

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

是否有快速生成NameValueCollection的方法?我想在不事先知道匿名类型属性的情况下获得与下面代码相同的结果。

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

4 个答案:

答案 0 :(得分:20)

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()));

答案 1 :(得分:4)

另一个(次要)变体,使用静态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()));

答案 2 :(得分: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());
}

答案 3 :(得分: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()));