【问题标题】:How can I access a field in an anonymous type stored in an object variable?如何访问存储在对象变量中的匿名类型的字段?
【发布时间】:2017-06-03 17:00:46
【问题描述】:

假设我的代码如下所示:

    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这个字段呢?

【问题讨论】:

  • 结构什么时候得到了默认构造函数?哈哈
  • 什么意思?你是说它不应该在不给结构明确定义的无参数构造函数的情况下编译吗?因为它确实没有一个编译。

标签: c# object struct var anonymous-types


【解决方案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);
    }
}

效果很好。

【讨论】:

    【解决方案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 的接口。

    【讨论】:

      【解决方案3】:

      使用dynamic 关键字:

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

      【讨论】:

        【解决方案4】:

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

        试试这个:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多