2011-11-16 137 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; 
    } 
}