【问题标题】:GetFields method to get enum values获取枚举值的 GetFields 方法
【发布时间】:2011-11-16 09:48:51
【问题描述】:
  1. 我注意到在枚举类型上调用GetFields() 时,我得到了一个int32 类型的额外字段。它从哪里来的??
  2. 当我调用另一个重载(GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static) ) 时,它会返回所需的字段。这是否意味着枚举的字段不是 Public ?

谢谢

【问题讨论】:

    标签: .net reflection enums


    【解决方案1】:

    ReflectorIL Spy可以解释这个。

    看看一个反编译的枚举,你会看到如下所示:

    .class public auto ansi sealed ConsoleApplication1.Foo
        extends [mscorlib]System.Enum
    {
        // Fields
        .field public specialname rtspecialname int32 value__
        .field public static literal valuetype ConsoleApplication1.Foo Bar = int32(0)
        .field public static literal valuetype ConsoleApplication1.Foo Baz = int32(1)
    
    } // end of class ConsoleApplication1.Foo
    

    Foo 枚举被实现为一个密封类,它包装了一个名为 value__int32 - 您看到的额外字段。

    值得注意的是,它还继承自System.Enum,其中有额外的(静态)字段。

    【讨论】:

    • 所以神秘字段的原因是它继承自 System.Enum ?
    • @eyal 不——额外的int32 字段是在“枚举类”本身上定义的,称为value__
    【解决方案2】:

    我怀疑该字段是基础值 - 毕竟,该值必须存储在某处。所以像这样的枚举:

    public enum Foo
    {
        Bar = 0,
        Baz = 1;
    }
    

    有点像这样:

    public struct Foo
    {
        public static readonly Bar = new Foo(0);
        public static readonly Baz = new Foo(1);
    
        private readonly int value;
    
        public Foo(int value)
        {
            this.value = value;
        }
    }
    

    【讨论】:

      【解决方案3】:

      请参阅通用语言基础架构 (CLI) 标准、ECMA 标准 335 中的“程序集和范围”。我会提供更具体的位置,但具体情况似乎可能会发生变化。前往Ecma International 了解标准。请参阅“CLS 规则 7”:

      枚举的基础类型应为内置 CLS 整数类型,字段名称应为“value__”,该字段应标记为 RTSpecialName。

      那是场,对吗?我不完全理解,但至少它试图解释它是什么。这是标准要求的。

      【讨论】:

        猜你喜欢
        • 2019-03-14
        • 1970-01-01
        • 1970-01-01
        • 2022-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-03
        相关资源
        最近更新 更多