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!
o
è null
, quindi non vi è alcun object o
non è null
ma non ha una proprietà Foo
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!"); } }