根据this的答案,自C#7.3起,我们可以将泛型约束到System.Enum。
但是,虽然可以使用
检查未知枚举的任何标志。HasFlag(枚举标志)
由于没有SetFlag()并且未为System.Enum定义|运算符,因此不可能设置一个未知的Enum的标志。
基本上我想做的是以下事情:
public static T Combine<T>(this IEnumerable<T> values) where T : System.Enum
{
var value = default(T);
foreach (var v in values)
{
value |= v;
}
return value;
}
C#编译器告诉我
| =运算符不能应用于类型'T'和'T'的操作数。
是否有可能创建这样的扩展方法?
答案 0 :(得分:0)
感谢Daniel A. White的评论,现在我可以像这样解决它:
public static T CombineIntEnums<T>(this IEnumerable<T> values) where T : Enum
{
int? result = null;
foreach (var enumVal in values)
{
// convert enum to int
var intVal = Convert.ToInt32(enumVal);
if (result.HasValue == false)
result = intVal;
result |= intVal;
}
// convert int to enum
var val = (T)Enum.ToObject(typeof(T), result ?? 0);
return val;
}