4
- 我注意到,在枚舉類型上調用
GetFields()
時,我得到了一個帶有int32類型的額外字段。它從哪裏來的?? - 當我呼叫其他超載
(GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static))
時,它返回所需的字段。這是否意味着枚舉的字段不是公有的?
GetFields()
時,我得到了一個帶有int32類型的額外字段。它從哪裏來的??(GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static))
時,它返回所需的字段。這是否意味着枚舉的字段不是公有的?
反射
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
繼承,其中也有額外的(靜態)字段。
我懷疑該字段爲基本價值 - 畢竟,該值必須存儲地方。所以像這樣的枚舉:
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;
}
}
所以神祕領域的原因是它從System.Enum繼承? – eyal
@eyal Nope - 額外的'int32'字段在「枚舉類」本身上定義並被稱爲'value__' – Justin