Как получить Перечислимое описание C# от значения? [дубликат]

364
задан Thomas M. Krystyan 20 June 2019 в 01:47
поделиться

3 ответа

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

Базовым типом данных по умолчанию для перечисления в C # является int , вы можете просто привести его.

343
ответ дан 23 November 2019 в 00:10
поделиться

Обновление

Неограниченная мелодия библиотека больше не поддерживается; Поддержка была прекращена в пользу Enums.NET .

В Enums.NET вы должны использовать:

string description = ((MyEnum)value).AsString(EnumFormat.Description);

Исходный пост

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

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

This :

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

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

88
ответ дан 23 November 2019 в 00:10
поделиться

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

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);
7
ответ дан 23 November 2019 в 00:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: