Конечно, вы можете использовать DisplayAttribute
для аннотирования ваших Enum
s.
enum OrderStatus
{
[Display(Description="Long Desc", Name="Awaiting Authorization", ShortName="Wait Auth")]
AwaitingAuthorization,
[Display(Description="...", Name="...", ShortName="...")]
InProduction,
[Display(Description="...", Name="...", ShortName="...")]
AwaitingDespatch
}
Вы также можете выбрать метод расширения, принимающий любое значение перечисления ивозвращает его отображаемое имя на основе атрибута, установленного для него, чтобы привести в порядок отображаемые значения в пользовательском интерфейсе следующим образом:
public static class EnumExtensions
{
public static string ToName(this Enum enumValue)
{
var displayAttribute = enumValue.GetType()
.GetMember(enumValue.ToString())[0]
.GetCustomAttributes(false)
.Select(a => a as DisplayAttribute)
.FirstOrDefault();
return displayAttribute?.Name ?? enumValue.ToString();
}
}
С
public enum Test
{
[Display(Name="AAA")]
a,
b
}
Код:
Console.WriteLine(Test.a.ToName());
Console.WriteLine(Test.b.ToName());
Результаты
AAA
b
Я хочу связать свои перечисления с SelectList с помощью метода расширения:
Для безопасности типов я бы не использовал методы расширения, а вместо этого статический класс, который работает с типом Enum:
Версия до C # 7.3.Так как Enum
не является допустимым ограничением типа до 7.3 (и это вызовет исключение во время компиляции), вы в конечном итоге будете считать, что перечисления являются типами значений, и они реализуют некоторые интерфейсы, чтобы ограничить параметр типакак можно ближе к Enum
.
public static class Enums<TEnum> where TEnum : struct, IComparable, IFormattable, IConvertible
{
static Enums()
{
if (!typeof(TEnum).IsEnum)
{
throw new InvalidOperationException();
}
}
}
C # 7.3+ версия с проверкой времени компиляции ... ууу!
public static class Enums<TEnum> where TEnum : Enum
{
}
GetValues Метод для класса:
public static IEnumerable<TEnum> GetValues(bool includeFirst)
{
var result = ((TEnum[])Enum.GetValues(typeof(TEnum))).ToList();
if (!includeZero)
result = result.Where(r => r != default).ToList();
return result;
}
Если вы следуете Enum Guidelines и включаете значение по умолчанию (ноль), мы можем его игнорировать (иногда мы хотим отобразить значение, например «Нет выбранных», а иногда нет »Неверный выбор ").
Затем мы можем добавить другой метод:
public static IEnumerable<string> GetNames(bool includeFirst)
{
var result = GetValue(includeFirst)
.Select(v => v.ToName())
.ToList();
return result;
}