пример - Как получить описание C#Enum из значения?




enum c# пример (4)

Вы не можете легко сделать это в общем виде: вы можете преобразовать целое число в определенный тип перечисления. Как показал Николас, это тривиальный бросок, если вы только заботитесь об одном виде перечисления, но если вы хотите написать общий метод, который может обрабатывать различные виды перечислений, все становится немного сложнее. Вам нужен метод в соответствии с:

public static string GetEnumDescription<TEnum>(int value)
{
  return GetEnumDescription((Enum)((TEnum)value));  // error!
}

но это приводит к ошибке компилятора, которая «int не может быть преобразована в TEnum» (и если вы обойдете это, то «TEnum не может быть преобразован в Enum»). Поэтому вам нужно обмануть компилятор, вставив приведение в объект:

public static string GetEnumDescription<TEnum>(int value)
{
  return GetEnumDescription((Enum)(object)((TEnum)(object)value));  // ugly, but works
}

Теперь вы можете вызвать это, чтобы получить описание любого типа перечисления:

GetEnumDescription<MyEnum>(1);
GetEnumDescription<YourEnum>(2);

Возможный дубликат:
Получение атрибутов значения Enum

У меня есть перечисление с атрибутами описания, например:

public enum MyEnum
{
    Name1 = 1,
    [Description("Here is another")]
    HereIsAnother = 2,
    [Description("Last one")]
    LastOne = 3
}

Я нашел этот бит кода для получения описания на основе Enum

public static string GetEnumDescription(Enum value)
{
    FieldInfo fi = value.GetType().GetField(value.ToString());

    DescriptionAttribute[] attributes =
        (DescriptionAttribute[])fi.GetCustomAttributes(
        typeof(DescriptionAttribute),
        false);

    if (attributes != null &&
        attributes.Length > 0)
        return attributes[0].Description;
    else
        return value.ToString();
}

Это позволяет мне писать код типа:

var myEnumDescriptions = from MyEnum n in Enum.GetValues(typeof(MyEnum))
                         select new { ID = (int)n, Name = Enumerations.GetEnumDescription(n) };

Я хочу сделать, если я знаю значение перечисления (например, 1) - как я могу получить описание? Другими словами, как преобразовать целое число в значение «Enum», чтобы перейти к моему методу GetDescription?


Чтобы сделать это проще в использовании, я написал общее расширение:

public static string ToDescription<TEnum>(this TEnum EnumValue) where TEnum : struct
{
    return Enumerations.GetEnumDescription((Enum)(object)((TEnum)EnumValue));
}

теперь я могу написать:

        MyEnum my = MyEnum.HereIsAnother;
        string description = my.ToDescription();
        System.Diagnostics.Debug.Print(description);

Примечание: замените «Перечисления» выше на ваше имя класса


Я реализовал это в универсальном, безопасном для типов способом в Unconstrained Melody - вы бы использовали:

string description = Enums.GetDescription((MyEnum)value);

Это:

  • Обеспечивает (с ограничениями общего типа), что значение действительно является значением перечисления
  • Избегает бокса в вашем текущем решении
  • Кэширует все описания, чтобы избежать использования отражения при каждом вызове
  • Имеет множество других методов, в том числе возможность анализировать значение из описания

Я понимаю, что основным ответом был просто MyEnum из int в MyEnum , но если вы делаете много работы enum, стоит подумать об использовании Unconstrained Melody :)


int value = 1;
string description = Enumerations.GetEnumDescription((MyEnum)value);

Основной тип данных по умолчанию для enum в C # - это int , вы можете просто бросить его.





enums