c# - 如何在 C# 中访问匿名类型的属性?

标签 c# .net object properties anonymous-types

我有这个:

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);

请注意,通过使用 ?.,我们会在三种不同情况下导致生成的 vnull!

  1. onull,所以根本没有对象
  2. o 是非 null 但没有属性 Foo
  3. 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/

相关文章:

c# - SSIS 和重新使用 C#

c++ - 对象的协变返回类型

java - java中的对象身份哈希码

c# - .Net 中的多显示器任务栏

javascript - Vue 获取发布数据到 Controller asp.net mvc

c# - 查询 XmlDocument 而不会出现 'Namespace prefix is not defined' 问题

c# - 确保用字符串中的数字拆分逗号分隔的字符串

c# - 使类位于同一文件夹中的访问修饰符 "friends"

python - 如何在 Python 3 中使用面向对象编程读取文本文件

c# - C# 或 vb.net 中的 DBSCAN 代码,用于聚类分析