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

时间:2017-01-19 05:19:03

标签: c# object struct var anonymous-types

假设我的代码看起来像这样:

    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

4 个答案:

答案 0 :(得分:2)

使用dynamic关键字:

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

答案 1 :(得分:2)

由于object没有bar的定义,因此您无法编译。如果由于某种原因您需要保留对匿名类型的引用,则需要使用dynamic。请注意,您不具备编译时类型安全性,并且可能会在执行此操作时遇到轻微的性能损失。

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

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

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

答案 2 :(得分:2)

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

试试这个:

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

答案 3 :(得分:1)

您可以像其他人建议的那样使用dynamic,也可以使用“原型”方法,如下所示:

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

这很好用。

相关问题