Почем type.GetProperties() возвращает пустой массив?

213
30 марта 2018, 09:58

Пытаюсь получить доступ к перечислению через рефлексию. Ожидаю, что GetProperties() выдаст массив с моим перечислением. Но вместо этого выдается пустой массив, почему?

public enum Test_enum { Sun,Mon,Tue, Wed, Thu, Fri, Sat };
Type type = typeof(Test_enum);
PropertyInfo[] properties = _enum.GetProperties();
Console.WriteLine("arr length " + properties.Length);
Answer 1

Когда вы объявляете перечисление, компилятор генерирует подобный IL:

.class private auto ansi sealed Test_enum
       extends [mscorlib]System.Enum
{
  .field public specialname rtspecialname int32 value__
  .field public static literal valuetype Test_enum Sun = int32(0x00000000)
  .field public static literal valuetype Test_enum Mon = int32(0x00000001)
  ...
} // end of class Test_enum

Что будет соответствовать примерно такому классу:

sealed class Test_enum : System.Enum
{
    public const Test_enum Sun = 0;
    public const Test_enum Mon = 1;
    ...
}

Как видите, каждый член вашего перечисления является константой, а не свойством. Достать эти константы можно при помощи рефлексии:

var fields = type.GetFields(BindingFlags.Public | BindingFlags.Static);
foreach (var field in fields)
{
    if (field.IsLiteral && !field.IsInitOnly)
    {
        // Искомая константа
    }
}

Где IsLiteral указывает, что поле не может быть изменено, а IsInitOnly показывает, что значение поля можно установить только в конструкторе (readonly)

Что бы не было недопонимания, Enum.GetNames внутри использует такой-же механизм рефлекcии, что делает код выше избыточным во многих случаях.

Answer 2
Enum.GetNames(typeof(Test_enum));
Enum.GetValues(typeof(Test_enum));

https://msdn.microsoft.com/en-us/library/system.enum.getvalues(v=vs.110).aspx

READ ALSO
Сохранение результатов в БД C#

Сохранение результатов в БД C#

Подскажите пожалуйста, необходимо результаты выполнения программы записывать в базу данныхА точнее на фотографии определяется пол и возраст...

201
Создание массива делегатов из массива MethodInfo[]

Создание массива делегатов из массива MethodInfo[]

Хай! Получаю все нужные методы

221
Вывести элементы в виде таблицы WPF

Вывести элементы в виде таблицы WPF

Как расположить элементы через Binding в виде таблицы? DataGrid не предлагайте, не подходит

248
Получить имя контроллера asp.net при помощи nameof

Получить имя контроллера asp.net при помощи nameof

Внимание! Это перевод вопроса How to use C# nameof() with ASPNET MVC Url

217