我有这个:
List<object> nodes = new List<object>();
nodes.Add(
new {
Checked = false,
depth = 1,
id = "div_" + d.Id
});
...我想知道我是否可以获取匿名对象的“已检查”属性。我不确定这是否可能。尝试这样做:
if (nodes.Any(n => n["Checked"] == false))
... 但它不起作用。
谢谢
最佳答案
如果您将对象存储为 object
类型,则需要使用反射。这对任何对象类型都是如此,无论是匿名的还是其他的。在一个对象 o 上,你可以得到它的类型:
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 中的另一种选择:
object v = o?.GetType().GetProperty("Foo")?.GetValue(o, null);
请注意,通过使用 ?.
,我们会在三种不同情况下导致生成的 v
为 null
!
o
是null
,所以根本没有对象o
是非null
但没有属性Foo
o
有一个属性Foo
但它的实际值恰好是null
。
所以这不等同于前面的示例,但如果您想对所有三种情况都一视同仁,则可能有意义。
要在单元测试中使用动态 读取匿名类型的属性,您需要告诉项目的编译器服务使程序集在测试项目内部可见。您可以将以下内容添加到项目 (.proj) 文件中。引用this link获取更多信息。
<ItemGroup>
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
<_Parameter1>Name of your test project</_Parameter1>
</AssemblyAttribute>
</ItemGroup>
关于c# - 如何在 C# 中访问匿名类型的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1203522/