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

本文关键字:枚举 规则 具有一 | 更新日期: 2023-09-27 17:57:07

假设我有一个像这样的枚举

enum A
{
    AA,
    BB,
    CC,
    DD
}

我想将字符串值解析为枚举类型,例如"abc"-> AA,"BB"-> BB,"CC"-> CC,"DD"-> 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();
        }
    }

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

出于某种原因,我严格不想在我的枚举上拥有属性。

有人有好主意吗?

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

以下行很丑陋,但我相信在技术上适用于这些特殊例外。

return (T)(object)A.AA;

替换以下代码:

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");
}

你可以使用 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 + '"');
    }
}