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