2010-05-15 3 views

Répondre

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

trop vite pour moi. verbatim sauf le nom de nvc. bon travail. –

+0

Le simple fait de copier son code m'a probablement valu quelques secondes de plus. –

+0

comment gérez-vous la valeur null? – Kiddo

2

Tout ce que vous voulez:

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

L'utilisation .ToList .foreach est plus rapide que foreach –

+0

Bon point. J'ai oublié ça. Mais le vrai tueur dans mon sln est le ToDictionary() –

+1

@Yuriy: Si nous nous inquiétons de la micro-optimisation, alors utiliser 'Array.ForEach' sera plus rapide encore, et ne nécessite pas le passage intermédiaire' ToList'. (Voir ma réponse pour un exemple.) – LukeH

3

Une autre variante (mineur), en utilisant la méthode Array.ForEach statique en boucle à travers les propriétés ...

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

I comme la réponse Yurity a donné avec un tweak mineur pour vérifier les nulls.

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