Преобразование строки в перечисление на C#

c# string enums


Как лучше всего конвертировать строку в значение перечисления на C#?

У меня есть HTML тег select,содержащий значения перечисления.Когда страница размещена,я хочу подобрать значение (которое будет в виде строки)и преобразовать его в значение перечисления.

В идеальном мире я мог бы сделать что-то подобное:

StatusEnum MyStatus = StatusEnum.Parse("Active");

но это недействительный код.




Answer 1 Keith


В .NET Core и .NET> 4 есть универсальный метод разбора :

Enum.TryParse("Active", out StatusEnum myStatus);

Это также включает в себя C # 7 в новый инлайн out переменных, так что это делает Try-парсер, преобразование в явном перечислимого типа и инициализирует + заполнит 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 дополнительными методами, которые применяются только в очень специфических контекстах, если ваша команда разработчиков не очень хорошо понимает, что делают эти расширения.




Answer 2 Erwin Mayer


Используйте Enum.TryParse<T>(String, T) (≥ .NET 4.0):

StatusEnum myStatus;
Enum.TryParse("Active", out myStatus);

Это можно еще больше упростить с помощью встроенного типа параметра в C # 7.0 :

Enum.TryParse("Active", out StatusEnum myStatus);



Answer 3 McKenzieG1


Обратите внимание, что производительность Enum.Parse() ужасна, потому что она реализована с помощью отражения. (То же самое относится и к Enum.ToString , который идет другим путем.)

Если вам нужно преобразовать строки в Enums в чувствительном к производительности коде, лучше всего при запуске создать Dictionary<String,YourEnum> и использовать его для ваших преобразований.




Answer 4 DavidWhitney


Вы ищете Enum.Parse .

SomeEnum enum = (SomeEnum)Enum.Parse(typeof(SomeEnum), "EnumValue");



Answer 5 Foyzul Karim


Вы можете использовать методы расширения сейчас:

public static T ToEnum<T>(this string value, bool ignoreCase = true)
{
    return (T) Enum.Parse(typeof (T), value, ignoreCase);
}

И вы можете вызвать их по следующему коду (здесь FilterType является типом enum):

FilterType filterType = type.ToEnum<FilterType>();