У .NET Core та .NET> 4 існує загальний метод розбору :
Enum.TryParse("Active", out StatusEnum myStatus);
Сюди також входять нові вбудові out
змінні C # 7 , тому це робить пробний аналіз, перетворення на явний тип перерахунку та ініціалізує + заповнює 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>();
Нарешті, можливо, ви хочете мати enum за замовчуванням для використання, якщо рядок неможливо проаналізувати:
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 додатковими методами, які застосовуються лише у дуже конкретних контекстах, якщо вся ваша команда розробників не дуже добре розуміє, що роблять ці розширення.