如何在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

  1. onull ,所以根本没有任何对象
  2. o是非null但没有属性Foo
  3. 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!"); } }