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

假设我有一个匿名类实例

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

有没有快速生成NameValueCollection的方法? 我想实现与下面的代码相同的结果,而不事先知道匿名类型的属性。

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

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

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

只是你想要的:

 Dictionary dict = foo.GetType() .GetProperties() .ToDictionary(pi => pi.Name, pi => pi.GetValue(foo, null)); NameValueCollection nvc = new NameValueCollection(); foreach (KeyValuePair item in dict) { nvc.Add(item.Key, item.Value.ToString()); } 

我喜欢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()));