Сведения о вопросе

Electro Full

08:37, 5th August, 2020

Теги

c#   string   enums    

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

Просмотров: 391   Ответов: 1

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

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

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

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

но это неверный код.



  Сведения об ответе

Chhiki

08:04, 19th August, 2020

В ядре .NET и .NET >4 есть общий метод синтаксического анализа :

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться