如何在C#中访问匿名types的属性?
我有这个:
List<object> nodes = new List<object>(); nodes.Add( new { Checked = false, depth = 1, id = "div_" + d.Id });
…我想知道是否可以抓住匿名对象的“Checked”属性。 我不确定这是否可能。 试过这样做:
if (nodes.Any(n => n["Checked"] == false))
…但它不起作用。
谢谢
如果你想要一个强types的匿名types列表,你还需要使这个列表成为一个匿名types。 最简单的方法是将一个数组等序列投影到列表中,例如
var nodes = (new[] { new { Checked = false, /* etc */ } }).ToList();
那么你可以像访问它一样:
nodes.Any(n => n.Checked);
由于编译器的工作方式,一旦你创build了列表,下面也应该工作,因为匿名types具有相同的结构,所以它们也是相同的types。 我没有一个编译器来手来validation这一点,虽然。
nodes.Add(new { Checked = false, /* etc */ });
如果将对象存储为typesobject
,则需要使用reflection。 任何对象types(匿名或其他)都是如此。 在一个对象o上,你可以得到它的types:
Type t = o.GetType();
然后从那里你查找一个属性:
PropertyInfo p = t.GetProperty("Foo");
那么从那里你可以得到一个价值:
object v = p.GetValue(o, null);
对于C#4的更新,这个答案早就已经过去了:
dynamic d = o; object v = d.Foo;
现在在C#6中的另一种select:
object v = o?.GetType().GetProperty("Foo")?.GetValue(o, null);
请注意,通过使用?.
我们导致v
在三种不同的情况下为null
!
-
o
是null
,所以根本没有任何对象 -
o
是非null
但没有属性Foo
-
o
有一个属性Foo
但它的实际值恰好为null
。
所以这不等同于前面的例子,但是如果你想把所有三种情况都看成是一样的话,那么可能是有意义的。
您可以使用Reflection来遍历匿名types的属性; 看看是否有一个“检查”属性,如果有,那么得到它的价值。
看到这个博客文章: http : //blogs.msdn.com/wriju/archive/2007/10/26/c-3-0-anonymous-type-and-net-reflection-hand-in-hand.aspx
所以像这样:
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!"); } }