我有两个问题,一个来自另一个。
我正在尝试将具有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,
};
最佳答案
您的枚举具有[Flags]
属性;它不继承自FlagsAttribute
-因此只需删除T : FlagsAttribute
约束即可。
在C#7.3或更高版本中,您可以直接使用where T : Enum
约束。无法在泛型约束中表达“具有特定属性”-您必须在运行时通过反射进行检查。