GetFields()
时,我得到一个类型为int32的额外字段。它从哪里来的?? (GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static) )
时,它会返回所需的字段。这是否意味着枚举的字段不是公共的? 感谢
答案 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。
那是领域,对吗?我并不完全理解这一点,但至少它试图解释它是什么。它是标准所要求的。