2011-11-16 135 views
4
  1. 我注意到,在枚举类型上调用GetFields()时,我得到了一个带有int32类型的额外字段。它从哪里来的??
  2. 当我呼叫其他超载(GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static))时,它返回所需的字段。这是否意味着枚举的字段不是公有的?

感谢获取枚举值的GetFields方法

回答

5

反射 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称为value__ - 额外的领域你是看到。

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

+0

所以神秘领域的原因是它从System.Enum继承? – eyal

+0

@eyal Nope - 额外的'int32'字段在“枚举类”本身上定义并被称为'value__' – Justin

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