如何用泛型函数合并[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
相关产品推荐
相关产品推荐

