Как вернуть значение Enum из строки? - PullRequest
6 голосов
/ 28 июля 2010

Я пытаюсь вернуть строго типизированное значение Enumeration из строки.Я уверен, что есть лучший способ сделать это.Это просто слишком много кода для такой простой вещи:

    public static DeviceType DefaultDeviceType
    {
        get
        {
            var deviceTypeString = GetSetting("DefaultDeviceType");
            if (deviceTypeString.Equals(DeviceType.IPhone.ToString()))
                return DeviceType.IPhone;
            if (deviceTypeString.Equals(DeviceType.Android.ToString()))
                return DeviceType.Android;
            if (deviceTypeString.Equals(DeviceType.BlackBerry.ToString()))
                return DeviceType.BlackBerry;
            if (deviceTypeString.Equals(DeviceType.Other.ToString()))
                return DeviceType.Other;
            return DeviceType.IPhone; // If no default is provided, use this default.
        }
    }

Идеи?

Основываясь на отзывах, полученных от сообщества, я решил использовать расширение методакоторый преобразует строку в перечисление.Он принимает один параметр (значение перечисления по умолчанию).Это значение по умолчанию также предоставляет тип, так что универсальный может быть выведен и его не нужно указывать явно с помощью <>.Теперь метод сокращен до этого:

    public static DeviceType DefaultDeviceType
    {
        get
        {
            return GetSetting("DefaultDeviceType").ToEnum(DeviceType.IPhone);
        }
    }

Очень крутое решение, которое можно использовать в будущем.

Ответы [ 3 ]

15 голосов
/ 28 июля 2010

Использование Enum.Parse():

var deviceTypeString = GetSetting("DefaultDeviceType");
return (DeviceType)Enum.Parse( typeof(DeviceType), deviceTypeString );

Если ввод ненадежный, вы должны позаботиться, потому что вы получите ArgumentException, если значение не может быть интерпретированокак одно из значений перечисления.

Существует также перегрузка Parse(), которая позволяет игнорировать регистр при выполнении этого преобразования, если это необходимо.

14 голосов
/ 28 июля 2010

Если вы имеете дело с (ненадежным) пользовательским вводом, мне нравится использовать метод расширения, который допускает значение по умолчанию. Попробуйте.

    public static TResult ParseEnum<TResult>(this string value, TResult defaultValue)
    {
        try
        {
            return (TResult)Enum.Parse(typeof(TResult), value, true);
        }
        catch (ArgumentException)
        {
            return defaultValue;
        }
    }
1 голос
/ 28 июля 2010

Я написал этот метод расширения один раз, чтобы преобразовать любой любой тип перечисления из строки, чтобы вам не приходилось писать код преобразования снова и снова:может сделать это:

//This is a enumeration for testing
enum MyEnumType
{
    ENUM1,
    ENUM2
}

//How to cast
var myEnum = "ENUM2".ConvertToEnum<MyEnumType>();

myEnum в этот момент должен равняться ENUM2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...