我们说我有一个类似的枚举
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();
}
}
代码甚至不会编译,因为编译器抱怨返回该特殊情况的值。
由于某种原因,我绝对不想归因于我的枚举。
任何人都有好主意?
答案 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 + '"');
}
}