You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用泛型函数合并[FLAGS]枚举的所有有效位(按位或)

泛型函数实现[Flags]枚举全有效位的按位或合并

需求很明确:写一个泛型函数,自动把标记了[Flags]特性的枚举里所有声明的有效位值通过按位或合并起来。比如针对这个枚举:

[Flags]
enum SuitsFlags { Spades = 1, Clubs = 2, Diamonds = 4, Hearts = 8 }

希望函数能返回Spades | Clubs | Diamonds | Hearts(对应数值15)。手动合并的话,后续新增枚举值很容易漏加,搞不好就出运行时错误,所以必须整个自动化的方案。

我自己试错后写出了可行的实现,代码如下:

public static TEnum GetAllFlags<TEnum>() where TEnum : Enum
{
    // 先检查枚举是否带Flags特性,防止误用
    if (!typeof(TEnum).IsDefined(typeof(FlagsAttribute), inherit: false))
    {
        throw new ArgumentException($"枚举 {typeof(TEnum).Name} 未标记 [Flags] 特性", nameof(TEnum));
    }

    // 获取枚举所有已声明的字段值
    var enumValues = Enum.GetValues(typeof(TEnum)).Cast<TEnum>();
    TEnum combinedResult = default;
    
    foreach (var value in enumValues)
    {
        // 用dynamic绕过编译时类型检查,执行按位或
        combinedResult = (dynamic)combinedResult | (dynamic)value;
    }

    return combinedResult;
}

这个实现的逻辑是:

  • 先做合法性校验,确保传入的是带[Flags]的枚举
  • 通过Enum.GetValues拿到枚举里所有已定义的字段值
  • 遍历所有值,逐个执行按位或合并成最终结果

不过总觉得用dynamic有点别扭,而且可能有性能上的小开销。想问问有没有更优的实现方式?比如不用dynamic,或者更高效的位运算合并思路?

内容的提问来源于stack exchange,提问作者Eric Ouellet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 07:22:10