有没有其他方法来测试枚举位字段?

Chr*_* C. 10 c# enums bit-manipulation

将Enums与位字段一起使用时:

   enum  ReallyBigEnum  { FirstChoice = 0x01, AnotherOption = 0x02 }
   ReallyBigEnum  flag = ReallyBigEnum.FirstChoice | ReallyBigEnum.AnotherOption;
Run Code Online (Sandbox Code Playgroud)

用于测试位的代码是:

   if( (flag & ReallyBigEnum.AnotherOption) == ReallyBigEnum.AnotherOption ) { ... }
Run Code Online (Sandbox Code Playgroud)

由于需要重复被测试的位,这看起来很冗长且容易出错.

如果有某种方式可以说:

   if( flag.IsSet( ReallyBigEnum.AnotherOption ) ) { ... }
Run Code Online (Sandbox Code Playgroud)

但是Enums不支持实例方法.所以,我尝试了一个模板功能:

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

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

   if( Enums.IsSet<ReallyBigEnum>( flag, ReallyBigEnum.AnotherOption ) ) { ... }
Run Code Online (Sandbox Code Playgroud)

写的很多.然后我试着缩短它:

   class Enums
   {
      public static bool IsSet( int flag, int bit ) { return (flag & bit) == bit; }
   }
Run Code Online (Sandbox Code Playgroud)

但是你必须将每个值转换为它的基类型,如下所示:

   if( Enums.IsSet( (int)flag, (int)ReallyBigEnum.AnotherOption ) ) { ... }
Run Code Online (Sandbox Code Playgroud)

这也是代码的痛苦并且失去了类型检查的好处.

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

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

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

非常感谢.

Axe*_*ger 6

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