2010-05-15 86 views
8

假設我有一個匿名的類的實例如何匿名類型的實例轉換爲NameValueCollection中

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

是否有一個快速的方法來產生的NameValueCollection?我想達到與下面的代碼相同的結果,而不提前知道匿名類型的屬性。

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

回答

18
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())); 
+0

對我來說太快了。逐字除外nvc的名稱。做得好。 – 2010-05-15 00:28:21

+0

只需複製他的代碼可能會讓我多花幾秒鐘時間。 – 2010-05-15 00:30:36

+0

你如何處理空值? – Kiddo 2014-05-09 13:22:35

2

只是你想要什麼:

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()); 
} 
+0

使用.ToList .ForEach比foreach更快 – 2010-05-15 01:45:57

+0

好點。忘了那個。但真正的殺手在我的sln是ToDictionary() – 2010-05-15 02:05:36

+1

@Yuriy:如果我們擔心微優化,那麼使用Array.ForEach將會更快,並且不需要中間的ToList傳遞。 (請參閱我的答案舉例。) – LukeH 2010-05-15 06:44:15

3

另一個(未成年人)的變化,採用靜態方法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())); 
0

我就像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()));