Comment accéder à la propriété de type anonyme en C #?

J’ai ceci:

List nodes = new List(); nodes.Add( new { Checked = false, depth = 1, id = "div_" + d.Id }); 

… et je me demande si je peux ensuite saisir la propriété “Checked” de l’object anonyme. Je ne sais pas si c’est même possible. J’ai essayé de faire ça:

if (nodes.Any(n => n["Checked"] == false)) … mais ça ne marche pas.

Merci

Si vous voulez une liste fortement typée de types anonymes, vous devez également faire de la liste un type anonyme. Le moyen le plus simple est de projeter une séquence telle qu’un tableau dans une liste, par exemple

 var nodes = (new[] { new { Checked = false, /* etc */ } }).ToList(); 

Ensuite, vous pourrez y accéder comme:

 nodes.Any(n => n.Checked); 

En raison de la manière dont fonctionne le compilateur, les éléments suivants devraient également fonctionner une fois que vous avez créé la liste, car les types anonymes ont la même structure et sont donc du même type. Je n’ai pas de compilateur à scope de main pour vérifier cela.

 nodes.Add(new { Checked = false, /* etc */ }); 

Si vous stockez l’object en tant qu’object de type, vous devez utiliser la reflection. Cela est vrai pour tout type d’object, anonyme ou autre. Sur un object o, vous pouvez obtenir son type:

 Type t = o.GetType(); 

Ensuite, vous cherchez une propriété:

 PropertyInfo p = t.GetProperty("Foo"); 

Ensuite, vous pouvez obtenir une valeur:

 object v = p.GetValue(o, null); 

Cette réponse est attendue depuis longtemps pour une mise à jour pour C # 4:

 dynamic d = o; object v = d.Foo; 

Et maintenant une autre alternative en C # 6:

 object v = o?.GetType().GetProperty("Foo")?.GetValue(o, null); 

Notez que en utilisant ?. nous provoquons que le résultat v soit null dans trois situations différentes!

  1. o est null , donc il n’y a pas d’object du tout
  2. o est non null mais n’a pas de propriété Foo
  3. o a une propriété Foo mais sa valeur réelle se trouve être null .

Donc, cela n’est pas équivalent aux exemples précédents, mais cela peut avoir un sens si vous voulez traiter les trois cas de la même manière.

Vous pouvez effectuer une itération sur les propriétés du type anonyme à l’aide de Reflection; voir s’il y a une propriété “Checked” et s’il y a alors sa valeur.

Voir cet article de blog: http://blogs.msdn.com/wriju/archive/2007/10/26/c-3-0-anonymous-type-and-net-reflection-hand-in-hand.aspx

Donc quelque chose comme:

 foreach(object o in nodes) { Type t = o.GetType(); PropertyInfo[] pi = t.GetProperties(); foreach (PropertyInfo p in pi) { if (p.Name=="Checked" && !(bool)p.GetValue(o)) Console.WriteLine("awesome!"); } }