2010-05-15 11 views
8

Anonim bir sınıf örneğim varAnonim bir örneğini NameValueCollection'a dönüştürme

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

NameValueCollection oluşturmanın hızlı bir yolu var mı? Anonim türün özelliklerini önceden bilmeden, aşağıdaki kodla aynı sonucu elde etmek istiyorum.

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

cevap

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

benim için çok hızlı. nvc adı dışında verbatim. aferin. –

+0

Sadece kodlarını kopyalamak bana birkaç saniye ekledi. –

+0

Boş değerle nasıl başa çıkıyorsunuz? – Kiddo

2

istediğini Hemen hemen:

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

foreach –

+0

İyi noktadan daha hızlıdır. Bunu unuttun. Kullandığımız sonra mikro optimizasyonu endişesi ediyorsanız 'Array.ForEach' hızlı hâlâ olacak ve pas ToList'' ara gerektirmez: Ama sln gerçek katil ToDictionary() –

+1

@Yuriy olduğunu. (Bir örnek için cevabımı görün.) – LukeH

3

özellikleri döngü statik Array.ForEach yöntemi kullanılarak bir başka (minör) varyasyon, ...

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

ben Yurity cevabı gibi nulls için küçük bir tweak verdi. .ToList .ForEach kullanma

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