При использовании Enums с битовыми полями:
enum ReallyBigEnum { FirstChoice = 0x01, AnotherOption = 0x02 }
ReallyBigEnum flag = ReallyBigEnum.FirstChoice | ReallyBigEnum.AnotherOption;
код, используемый для проверки бит:
if( (flag & ReallyBigEnum.AnotherOption) == ReallyBigEnum.AnotherOption ) { ... }
который кажется многословным и подверженным ошибкам из-за необходимости повторять бит проверяются.
Было бы неплохо, если бы можно было сказать:
if( flag.IsSet( ReallyBigEnum.AnotherOption ) ) { ... }
но Enums не поддерживают методы экземпляра. Итак, я попробовал функцию шаблона:
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 ) ) { ... }
что также является болью для кодирования и теряет преимущество проверки типов.
Та же функция может быть записана для использования параметров "объект", но затем тип объекта и базовый тип должны быть протестированы.
Итак, я застрял со стандартным избыточным способом вверху.
Есть ли у кого-нибудь другие идеи о чистом, простом способе тестирования полей бит Enum?
Большое спасибо.