如何访问存储在对象变量中的匿名类型的字段?

How can I access a field in an anonymous type stored in an object variable?

假设我有这样的代码:

    public struct Foo
    {
        public object obj;
        public Foo(int val)
        {
            obj = new {
                bar = val
            };
            Console.WriteLine(obj.bar); // Can't access bar.
        }
    }

通常我会看到匿名类型存储在隐式类型变量中,在这种情况下可以很好地访问它们的字段。但是在这种情况下我不能隐式键入 var 因为 obj 是结构中的一个字段并且显然无法初始化。那么如何访问字段 bar?

使用dynamic关键字:

public struct Foo
{
    public dynamic obj;
    public Foo(int val)
    {
        obj = new
        {
            bar = val
        };
        Console.WriteLine(obj.bar); // is accessible now
    }
}

您所做的将无法编译,因为 object 没有 bar 的定义。如果出于某种原因需要保留对匿名类型的引用,则需要使用 dynamic。请注意,您将没有 compile-time 类型安全,这样做可能会对性能造成轻微影响。

public struct Foo
{
    public dynamic obj;
    public Foo(int val)
    {
        obj = new {
            bar = val
        };
    }

    public void WriteMyFooBar()
    {
        Console.WriteLine(obj.bar);
    }
}

然而,有人质疑这里使用匿名类型而不是定义一个至少为 bar 提供 getter 的接口。

您可以尝试将类型对象的 obj 转换为 dynamic 然后访问所需的值,或者您可以将 obj 的类型更改为 dynamic

试试这个:

 Console.WriteLine(((dynamic)obj).bar)); 

您可以按照其他人的建议使用 dynamic,或者您可以使用 "prototype" 方法,如下所示:

public struct Foo
{
    public object obj;
    public Foo(int val)
    {
        obj = new {
            bar = val
        };
        this.Use(new { bar = 0 }, x => Console.WriteLine(x.bar));
    }
    public void Use<T>(T prototype, Action<T> action)
    {
        action((T)this.obj);
    }
}

效果很好。