When using Enums with bit fields:
enum ReallyBigEnum { FirstChoice = 0x01, AnotherOption = 0x02 }
ReallyBigEnum flag = ReallyBigEnum.FirstChoice | ReallyBigEnum.AnotherOption;
the code used to test the bits is:
if( (flag & ReallyBigEnum.AnotherOption) == ReallyBigEnum.AnotherOption ) { ... }
which seems verbose and error prone because of the need to repeat the bit being tested.
It would be nice if there were some way to say:
if( flag.IsSet( ReallyBigEnum.AnotherOption ) ) { ... }
but Enums don't support instance methods. So, I tried a template function:
class Enums
{
public static bool IsSet<T>( T flag, T bit ) { return (flag & bit) == bit; }
}
but the code to test bits then looks like this:
if( Enums.IsSet<ReallyBigEnum>( flag, ReallyBigEnum.AnotherOption ) ) { ... }
which is a lot to write. Then I tried to shorten it:
class Enums
{
public static bool IsSet( int flag, int bit ) { return (flag & bit) == bit; }
}
but then you have to cast each value to its base type like this:
if( Enums.IsSet( (int)flag, (int)ReallyBigEnum.AnotherOption ) ) { ... }
which is also a pain to code and loses the benefit of type checking.
The same function could be written to use 'object' parameters, but then the object type and underlying base type would have to be tested.
So, I'm stuck with the standard, redundant way at the top.
Does anyone have other ideas on a clean, simple way of testing Enum bit fields?
Much Thanks.