Пытаюсь получить доступ к перечислению через рефлексию. Ожидаю, что 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);
Когда вы объявляете перечисление, компилятор генерирует подобный 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ии, что делает код выше избыточным во многих случаях.
Enum.GetNames(typeof(Test_enum));
Enum.GetValues(typeof(Test_enum));
https://msdn.microsoft.com/en-us/library/system.enum.getvalues(v=vs.110).aspx
Виртуальный выделенный сервер (VDS) становится отличным выбором
Подскажите пожалуйста, необходимо результаты выполнения программы записывать в базу данныхА точнее на фотографии определяется пол и возраст...
Как расположить элементы через Binding в виде таблицы? DataGrid не предлагайте, не подходит
Внимание! Это перевод вопроса How to use C# nameof() with ASPNET MVC Url