В .NET Core и .NET> 4 есть общий метод синтаксического анализа :
Enum.TryParse("Active", out StatusEnum myStatus);
Сюда также входят новые встроенные переменные out
в C # 7, так что при этом выполняется попытка синтаксического анализа, преобразование в явный тип enum и инициализация + заполнения переменной myStatus
.
Если у вас есть доступ к C # 7 и последней версии .NET, это лучший способ.
Оригинальный ответ
В .NET это довольно некрасиво (до 4 или выше):
StatusEnum MyStatus = (StatusEnum) Enum.Parse(typeof(StatusEnum), "Active", true);
Я склонен упростить это с помощью:
public static T ParseEnum<T>(string value)
{
return (T) Enum.Parse(typeof(T), value, true);
}
Тогда я могу сделать:
StatusEnum MyStatus = EnumUtil.ParseEnum<StatusEnum>("Active");
В комментариях предлагается один вариант - добавить расширение, которое достаточно просто:
public static T ToEnum<T>(this string value)
{
return (T) Enum.Parse(typeof(T), value, true);
}
StatusEnum MyStatus = "Active".ToEnum<StatusEnum>();
Наконец, вы можете захотеть использовать перечисление по умолчанию, если строка не может быть проанализирована:
public static T ToEnum<T>(this string value, T defaultValue)
{
if (string.IsNullOrEmpty(value))
{
return defaultValue;
}
T result;
return Enum.TryParse<T>(value, true, out result) ? result : defaultValue;
}
Что делает этот звонок:
StatusEnum MyStatus = "Active".ToEnum(StatusEnum.None);
Однако я бы осторожно добавил такой метод расширения к string
, поскольку (без управления пространством имен) он будет отображаться во всех экземплярах string
независимо от того, содержат ли они перечисление или нет (поэтому 1234.ToString().ToEnum(StatusEnum.None)
будет допустимым но бессмысленно). Часто лучше избегать загромождения основных классов Microsoft дополнительными методами, которые применяются только в очень специфических контекстах, если ваша команда разработчиков не очень хорошо понимает, что делают эти расширения.