Поскольку ваше перечисление содержит флаги (или, если вы предпочитаете, это битовое поле), вы должны добавить к нему FlagsAttribute
:
[Flags]
public enum Option
{
Option_A = 1,
Option_B = 2,
Option_C = 4,
Option_D = 8,
}
А затем проверка обычно выполняется с помощью побитового оператора и оператора. Также потребуется приведение, потому что вы используете переменную int
.
if(((Option)activeOption & Option.Option_A) != Option.Option_A) //...
Если вы хотите скрыть эту гадость, прочитайте статью, на которую есть ссылка в Smudge202-ответ . Если вы используете .NET 4, вам даже не нужно этого делать: проверьте ответ sehe .
Но вам действительно следует попытаться использовать переменную типа Option
напрямую и объединить параметры с побитовым оператором или:
Option activeOption = Option.Option_A | Option.Option_C;
Конечно, использование этой схемы ограничивает количество вариантов, которые вы можете создать. Если вы оставите все как есть, вы можете создать только 32 различных параметра, потому что int
(базовый тип перечисления по умолчанию) имеет только 32 бита. Если вы используете long
, у вас может быть 64 различных варианта:
[Flags]
public enum Option : long
{
Option_A = 1,
Option_B = 2,
Option_C = 4,
Option_D = 8,
// blah blah
}
Однако, если вам нужно произвольное количество опций, возможно, пришло время изменить стратегии. Вы можете создать пользовательский тип, который будет вести себя как перечисление, но вам, вероятно, будет лучше, если использовать просто обычное перечисление без флагов и HashSet<Option>
.
public enum Option
{
Option_A = 1, // notice the sequential values now
Option_B = 2,
Option_C = 3,
Option_D = 4,
}
HashSet<Option> options = new HashSet<Option> { Option.Option_A, Option.Option_C };
if(options.Contains(Option.Option_A)) // ...