Come accedere alla proprietà di tipo anonimo in C #?

Ho questo:

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

… e mi chiedo se posso quindi prendere la proprietà “Controllata” dell’object anonimo. Non sono sicuro che sia ansible. Ho provato a fare questo:

if (nodes.Any(n => n["Checked"] == false)) … ma non funziona.

Grazie

Se si desidera un elenco fortemente tipizzato di tipi anonimi, è necessario rendere l’elenco anche un tipo anonimo. Il modo più semplice per farlo è proiettare una sequenza come una matrice in una lista, ad es

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

Allora sarai in grado di accedervi come:

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

A causa del modo in cui il compilatore funziona, il seguente dovrebbe funzionare anche dopo aver creato l’elenco, perché i tipi anonimi hanno la stessa struttura, quindi sono anche dello stesso tipo. Non ho un compilatore a portata di mano per verificare questo però.

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

Se stai archiviando l’object come tipo object , devi usare la riflessione. Questo vale per qualsiasi tipo di object, anonimo o altro. Su un object o, puoi ottenere il suo tipo:

 Type t = o.GetType(); 

Poi da quella cerchi una proprietà:

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

Quindi da ciò puoi ottenere un valore:

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

Questa risposta è attesa da tempo per un aggiornamento per C # 4:

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

E ora un’altra alternativa in C # 6:

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

Si noti che usando ?. facciamo in modo che la risultante v sia null in tre diverse situazioni!

  1. o è null , quindi non vi è alcun object
  2. o non è null ma non ha una proprietà Foo
  3. o ha una proprietà Foo ma il suo valore reale sembra essere null .

Quindi questo non è equivalente agli esempi precedenti, ma potrebbe avere senso se si desidera trattare tutti e tre i casi allo stesso modo.

È ansible eseguire l’iterazione sulle proprietà del tipo anonimo utilizzando Reflection; vedi se c’è una proprietà “Controllata” e se c’è ne ottiene il valore.

Vedi questo post del blog: http://blogs.msdn.com/wriju/archive/2007/10/26/c-3-0-anonymous-type-and-net-reflection-hand-in-hand.aspx

Quindi qualcosa come:

 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!"); } }