假设我有一个匿名类实例
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 的方法?我想在不事先知道匿名类型的属性的情况下实现与下面的代码相同的结果。
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<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());
}
我喜欢 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()));