При использовании 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?
Большое спасибо.