我正在尝试从字符串返回强类型的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);
}
}
非常酷的解决方案,可以在将来重复使用。
答案 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