具有一些例外规则的通用枚举解析器

时间:2014-04-07 20:04:00

标签: c#

我们说我有一个类似的枚举

enum A
{
    AA,
    BB,
    CC,
    DD
}

我想将字符串值解析为Enum类型,例如&#34; abc&#34; - &GT; AA,&#34; BB&#34; - &GT; BB,&#34; CC&#34; - &GT; CC,&#34; DD&#34; - &GT; DD,你可以看到AA有一些特殊的翻译规则。因此,在这种情况下,Enum.TryParse<A>("abc", true, out AEnum)不会达到目的。我可以编写一些特殊代码来处理这个异常值,其余的值可以使用泛型枚举解析器。

我有几个包含此类例外规则的枚举,但如果我想出这种类型的代码

    public static T GetEnumValue<T>(this string stringValue) where T : struct, IComparable, IConvertible, IFormattable
    {
        if (typeof(T).IsEnum)
        {
            if (typeof(T) == typeof(A))
            {
                T myEnum;
                if (Enum.TryParse<T>(stringValue, true, out myEnum))
                {
                    return myEnum;
                }
                else
                {
                    // handle some special cases.
                    if (string.Compare(stringValue, "abc", StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        return A.AA;
                    }
                }
            }

            return default(T);
        }
        else
        {
            throw new Exception();
        }
    }

代码甚至不会编译,因为编译器抱怨返回该特殊情况的值。

由于某种原因,我绝对不想归因于我的枚举。

任何人都有好主意?

3 个答案:

答案 0 :(得分:1)

以下几行很难看,但我相信在技术上可以解决这些特殊例外情况。

return (T)(object)A.AA;

答案 1 :(得分:1)

替换以下代码:

if (string.Compare(stringValue, "abc", StringComparison.OrdinalIgnoreCase) == 0)
{
    return A.AA;
}

通过

if (string.Compare(stringValue, "abc", StringComparison.OrdinalIgnoreCase) == 0)
{
    return (T)Enum.Parse(typeof(T), "AA");
}

答案 2 :(得分:0)

您可以使用Json.NET作为解析器。使用EnumMember,您可以指定规则的例外情况。默认情况下,它不区分大小写。

void Main()
{
    Console.WriteLine("abc".GetEnumValue<A>()); // AA
    Console.WriteLine("ABC".GetEnumValue<A>()); // AA
    Console.WriteLine("AA".GetEnumValue<A>());  // AA
    Console.WriteLine("Bb".GetEnumValue<A>());  // BB
}

[JsonConverter(typeof(StringEnumConverter))]
enum A
{
    [EnumMember(Value = "abc")]
    AA,
    BB,
    CC,
    DD
}
public static class Ext
{
    public static T GetEnumValue<T>(this string stringValue)
            where T : struct, IComparable, IConvertible, IFormattable
    {
        return JsonConvert.DeserializeObject<T>('"' + stringValue + '"');
    }
}