合并通用枚举的标记

时间:2019-01-08 21:03:16

标签: c# generics enums enum-flags

根据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'的操作数。

是否有可能创建这样的扩展方法?

1 个答案:

答案 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;
    }