GetFields方法获取枚举值

时间:2011-11-16 09:48:51

标签: .net reflection enums

  1. 我注意到在枚举类型上调用GetFields()时,我得到一个类型为int32的额外字段。它从哪里来的??
  2. 当我调用另一个重载(GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static) )时,它会返回所需的字段。这是否意味着枚举的字段不是公共的?
  3. 感谢

3 个答案:

答案 0 :(得分:6)

反射器 IL 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枚举被实现为一个封闭的类,它包含一个名为int32的{​​{1}} - 您正在看到的额外字段。

值得注意的是,它也继承自value__ 还有额外的(静态)字段。

答案 1 :(得分: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;
    }
}

答案 2 :(得分:0)

请参阅公共语言基础结构(CLI)标准中的“程序集和范围”,ECMA标准335.我将提供更具体的位置,但具体情况似乎可能会发生变化。转到Ecma International获取标准。请参阅“CLS规则7”,其中包含:

  

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

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