如何从字符串返回枚举值?

时间:2010-07-28 18:15:36

标签: c# parsing enums

我正在尝试从字符串返回强类型的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 个答案:

答案 0 :(得分:15)

使用Enum.Parse()

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

如果输入不可靠,您应该小心,因为如果该值不能被解释为枚举值之一,您将获得ArgumentException

还有Parse()的重载,如果需要,您可以在进行此转换时忽略大小写。

答案 1 :(得分:14)

如果您正在处理(不可靠)用户输入,我想使用允许默认值的扩展方法。尝试一下。

    public static TResult ParseEnum<TResult>(this string value, TResult defaultValue)
    {
        try
        {
            return (TResult)Enum.Parse(typeof(TResult), value, true);
        }
        catch (ArgumentException)
        {
            return defaultValue;
        }
    }

答案 2 :(得分:1)

我编写了这个扩展方法一次,从字符串转换为任何枚举类型,这样你就不必一遍又一遍地编写转换代码:

    public static class StringExtensions
    {

    public static T ConvertToEnum<T>(this string value)
    {
        //Guard condition to not allow this to be used with any other type than an Enum
        if (typeof(T).BaseType != typeof(Enum))
        {
            throw new InvalidCastException(string.Format("ConvertToEnum does not support converting to type of [{0}]", typeof(T)));
        }


        if (Enum.IsDefined(typeof(T), value) == false)
        {
            //you can throw an exception if the string does not exist in the enum
            throw new InvalidCastException();

            //If you prefer to return the first available enum as the default value then do this
           Enum.GetNames(typeof (T))[0].ConvertToEnum<T>(); //Note: I haven't tested this
        }
        return (T)Enum.Parse(typeof(T), value);
    }
}

要实际使用它,您可以这样做:

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

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

myEnum应该等于ENUM2