В .NET Core и .NET> 4 есть универсальный метод разбора :
Enum.TryParse("Active", out StatusEnum myStatus);
Это также включает в себя новые встроенные out
переменные C # 7 , так что это делает try-parse, преобразование в явный тип 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 дополнительными методами, которые применяются только в очень специфических контекстах, если ваша команда разработчиков не очень хорошо понимает, что делают эти расширения.