【发布时间】:2019-11-25 16:23:08
【问题描述】:
我有两个问题,一个来自另一个。
- 我正在尝试将具有
FlagsAttribute属性的枚举解析为另一个也具有相同属性的枚举。我的尝试在下面的代码中。如果有人找到了一种有效的方法,请告诉我。因为我当前的方法涉及迭代所有设置的标志并一一解析,然后将它们逻辑或运算在一起。 - 在尝试解决这个问题时,我收到了这个错误:
The type 'Program.Test' cannot be used as type parameter 'T' in the generic type or method 'Program.Parse<T>(string, bool)'. There is no boxing conversion from 'Program.Test' to 'System.FlagsAttribute'.我在这里真正要寻找的是对原因的解释。显然,两个枚举都有Flags属性,它是FlagsAttribute的简写,所以不应该已经存在转换吗?
还有懒人的链接:DotNetFiddle
代码:
public static void Main()
{
var q = Parse<TestType>((Test.ACT | Test.SAT_2016).ToString());
Console.WriteLine(string.Format("Type: {0}\t Value: {1}", q.GetType(), q));
// */
}
public static T Parse<T>(string value, bool ignoreCase = false)
where T : FlagsAttribute , IComparable, IFormattable, IConvertible
{
if (value.ToString().Contains(",")){
var parts = value.ToString().Split(',');
var results = new List<T> ();
var final = default(T);
foreach (var part in parts){
try {
final |= (T)Enum.Parse(typeof(T), part, ignoreCase) ;
}catch (Exception e){
Console.WriteLine("Got exception");
/* Supressed */
}
}
return final;
}else{
return (T) Enum.Parse(typeof(T), value.ToString(), ignoreCase);
}
}
[Flags]
public enum Test{
ACT = 32,
SAT_2016 = 65536,
};
[Flags]
public enum TestType {
ACT = 4,
SAT_2016 = 39,
};
【问题讨论】:
-
你也可以试试 where T : new() 放宽一般限制。不过,我不确定这是否是您所需要的。
-
您不必在
value上调用ToString,因为它已经是string。此外,您可以使用拆分字符串的代码而不是检查逗号,因为即使没有逗号也可以工作(它将返回一个仅包含原始字符串的数组)。如果不是,则在解析不包含逗号的值时不会捕获潜在异常。
标签: c# enums attributes .net-4.7.2