c# - 还有另一种测试枚举位域的方法吗?

标签 c# enums bit-manipulation

将枚举与位字段一起使用时:

   enum  ReallyBigEnum  { FirstChoice = 0x01, AnotherOption = 0x02 }
   ReallyBigEnum  flag = ReallyBigEnum.FirstChoice | ReallyBigEnum.AnotherOption;

用于测试位的代码是:

   if( (flag & ReallyBigEnum.AnotherOption) == ReallyBigEnum.AnotherOption ) { ... }

这看起来冗长且容易出错,因为需要重复该位 正在测试中。

如果有某种表达方式就好了:

   if( flag.IsSet( ReallyBigEnum.AnotherOption ) ) { ... }

但是枚举不支持实例方法。所以,我尝试了一个模板函数:

   class Enums
   {
      public static bool IsSet<T>( T flag, T bit ) { return (flag & bit) == bit; }
   }

但是测试位的代码看起来像这样:

   if( Enums.IsSet<ReallyBigEnum>( flag, ReallyBigEnum.AnotherOption ) ) { ... }

要写的东西很多。然后我试着缩短它:

   class Enums
   {
      public static bool IsSet( int flag, int bit ) { return (flag & bit) == bit; }
   }

但是你必须像这样将每个值转换为它的基类型:

   if( Enums.IsSet( (int)flag, (int)ReallyBigEnum.AnotherOption ) ) { ... }

编码起来也很痛苦,并且失去了类型检查的好处。

可以编写相同的函数来使用“对象”参数,但是 必须测试对象类型和底层基类型。

所以,我坚持使用顶部的标准冗余方式。

对于测试枚举位字段的干净、简单的方法,是否有人有其他想法?

非常感谢。

最佳答案

直到 .Net 3.5,这是您唯一的选择。在 .Net 4.0 中,枚举上有一个 HasFlag 方法。

关于c# - 还有另一种测试枚举位域的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3730544/

相关文章:

c# - 设置从其他表单可见的控件

java - 如何使用枚举创建单例类

c - C函数,使用按位运算来查看int x是否适合n位

c - C 语言中的高效位屏蔽代码

c - 找到二进制基础的最快方法

c# - 将 dll 转换为 csproj 或 sln

c# - 如何在 C# 中将实例变量视为另一种类型的实例

java - 遍历 Java 中的枚举类数组,测试每个类的 `parse()` 方法

c# - 如何以管理员身份从应用程序访问 Azure 移动服务?

c# - 在运行时将 TypeConverter 属性添加到枚举