.NET 3.5没有枚举类型的tryparse方法,如何安全地将字符串解析为枚举类型?

3

可能是重复问题:
如何尝试解析枚举值?

我正在使用 .net 3.5,它没有 Enum.TryParse。

那么我该如何安全地将字符串解析为枚举类型呢?

在 .net 4.0 中,我是这样做的:

SomeEnum someEnum;
if (Enum.TryParse(someString, true, out someEnum))
{
  //
}

请看一下这篇文章,它解释了一些解决方法:http://damieng.com/blog/2010/10/17/enums-better-syntax-improved-performance-and-tryparse-in-net-3-5 - MethodMan
2个回答

7
你可以使用Enum.GetNames(...).Contains,然后使用Enum.Parse。

3

另一种缺失方法的版本: Enum.TryParse (C#中)

所有类型的“TryParse”方法非常有用,我一直在使用它们。但令人惊讶的是,微软没有在Framework中包含一个非常有用的方法: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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接