Метод GetFields для получения значений перечисления - PullRequest
4 голосов
/ 16 ноября 2011
  1. Я заметил, что при вызове GetFields() для типа enum я получаю дополнительные поля с типом int32.откуда это??
  2. Когда я вызываю другую перегрузку (GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static) ), она возвращает нужные поля.это означает, что поля enum не являются открытыми?

спасибо

Ответы [ 3 ]

6 голосов
/ 16 ноября 2011

Отражатель 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, который также имеет дополнительные (статические) поля.

2 голосов
/ 16 ноября 2011

Я подозреваю, что поле является основным значением - в конце концов, это значение должно храниться где-то . Итак, перечисление вот так:

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;
    }
}
0 голосов
/ 16 мая 2018

См. «Сборки и область применения» в стандарте Common Language Infrastructure (CLI), стандарт ECMA 335. Я хотел бы предоставить более конкретное местоположение, но, похоже, специфика может быть изменена.Перейти к Ecma International для стандарта.См. «Правило 7 CLS», в котором говорится:

Базовым типом перечисления должен быть встроенный целочисленный тип CLS, имя поля должно быть «value__», и это поле должно бытьотмечено RTSpecialName.

Это поле, верно?Я не совсем понимаю это, но, по крайней мере, он пытается объяснить, что это такое.Требуется по стандарту.

...