可能重复:
如何尝试解析枚举值?
我正在使用没有 Enum.TryParse 的 .net 3.5。
那么如何安全地将字符串解析为枚举呢?
我在 .net 4.0 中这样做:
SomeEnum someEnum;
if (Enum.TryParse(someString, true, out someEnum))
{
//
}
可能重复:
如何尝试解析枚举值?
我正在使用没有 Enum.TryParse 的 .net 3.5。
那么如何安全地将字符串解析为枚举呢?
我在 .net 4.0 中这样做:
SomeEnum someEnum;
if (Enum.TryParse(someString, true, out someEnum))
{
//
}
您可以使用 Enum.GetNames(...).Contains 然后 Enum.Parse
缺少方法的另一个版本:Enum.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”方法编写了自己的通用版本,该方法也忽略大小写,不使用 try & catch:
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;