可能重复:
How to TryParse for Enum value?.NET 3.5没有enum.tryparse,如何安全地解析字符串来枚举呢?
我使用.NET 3.5不具有Enum.TryParse。
如何安全地将字符串解析为枚举呢?
我是在.NET 4.0中这样做:
SomeEnum someEnum;
if (Enum.TryParse(someString, true, out someEnum))
{
//
}
可能重复:
How to TryParse for Enum value?.NET 3.5没有enum.tryparse,如何安全地解析字符串来枚举呢?
我使用.NET 3.5不具有Enum.TryParse。
如何安全地将字符串解析为枚举呢?
我是在.NET 4.0中这样做:
SomeEnum someEnum;
if (Enum.TryParse(someString, true, out someEnum))
{
//
}
您可以使用Enum.GetNames(...)包含然后Enum.Parse
另一个版本缺少方法:。枚举.TryParse(在C#)
的“的TryParse”所有类型的方法是非常有用的,我用他们所有的时间。微软在框架中没有包含一个非常有用的方法,这是非常令人惊讶的:Enum.TryParse。许多编码者发现自己不时地为他们的枚举“解析”方法。类似的东西:
public enum ImageType
{
Jpg,
Gif,
Png
}
public static ImageType ParseImagetype(string typeName)
{
typeName = typeName.ToLower();
switch (typeName)
{
case "Gif":
return ImageType.Gif;
case "png":
return ImageType.Png;
default:
case "jpg":
return ImageType.Jpg;
}
}...
这工作得很好,但你需要为每个枚举你写有这样的'解析'方法。 Enum类有自己的'解析'方法(可能有'IgnoreCase'标志),但不是TryParse方法。常见的解决方法是将Enum.Parse方法放入Try & Catch,如果发生故障,则会导致性能下降。 Enum类还有一个方法'IsDefined',如果枚举中存在一个值,它将返回一个指示。不幸的是,这种方法没有'IgnoreCase'标志。
因此,试图把所有这些“知识”一起,我写了“Enum.TryParse”的方法我自己的通用版本,也忽略大小写和不使用尝试&陷阱:
public static bool EnumTryParse<T>(string strType,out T result)
{
string strTypeFixed = strType.Replace(' ', '_');
if (Enum.IsDefined(typeof(T), strTypeFixed))
{
result = (T)Enum.Parse(typeof(T), strTypeFixed, true);
return true;
}
else
{
foreach (string value in Enum.GetNames(typeof(T)))
{
if (value.Equals(strTypeFixed, StringComparison.OrdinalIgnoreCase))
{
result = (T)Enum.Parse(typeof(T), value);
return true;
}
}
result = default(T);
return false;
}
}
线'string strTypeFixed = strType.Replace('','');'是因为我从第三方WebService获取数据,该数据使用空格发送枚举字符串,在枚举中不允许使用这些数据,所以我的枚举具有''而不是空格。
为了解析将ImageType(从上面的例子),只要用这样的:
ImageType type;
if (Utils.EnumTryParse<ImageType>(typeName, out type))
{
return type;
}
return ImageType.Jpg;
看看这篇文章,以及它解释了一些变通http://damieng.com/blog/2010/10/17 /枚举-更好 - 句法 - 改进的性能和 - 的TryParse-在净3-5 – MethodMan