具有一些例外规则的通用枚举解析器
本文关键字:枚举 规则 具有一 | 更新日期: 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 + '"');
}
}