2014-11-21 1 views
0

У меня довольно большое перечисление флагов, которое называется AmendmentType. Мне нужно проверить, что если у него есть определенные Enums и любые другие.Если Enum имеет определенный флаг, проверьте, есть ли у него какие-либо другие

Для примера:

var foo = AmendmentType.Item1; 

if (foo.HasFlag(AmendmentType.Item1) && (ANYTHING ELSE)) 
{ 
//DO NOT ALLOW 
} 
else if (foo.HasFlag(AmendmentType.Item2) && foo.HasFlag(AmendmentType.Item6)) 
{ 
//DO NOT ALLOW 
} 
else 
{ 
//ALLOW 
} 

Как это возможно? В Enum Flag имеется около 20 различных элементов, и кажется, что должен быть проще, чем проверять все возможные комбинации.

+0

Почему бы не просто 'if (foo.HasFlag (1) || foo.HasFlag (2) ..) 'etc? – DLeh

+0

Так вы просто * спрашиваете о части «что-нибудь еще»? –

+0

Да, что бы я проверил, чтобы получить «Что-нибудь еще»? –

ответ

4

Если вы заинтересованы только в той части, вы помечены как «все остальное», вы можете Применение:

if (foo.HasFlag(AmendmentTypeEnum.Item1) && (foo & ~AmendmentTypeEnum.Item1) != 0) 

Или просто проверить, что это не в точности равна Item1:

if (foo.HasFlag(AmendmentTypeEnum.Item1) && foo != AmendmentTypeEnum.Item1) 

Следует отметить, что проверка на наличие все множества флагов нужно только один HasFlag: вызов тоже

else if (foo.HasFlag(AmendmentTypeEnum.Item2 | AmendmentTypeEnum.Item6)) 

(я также предлагаю извлекая суффикс Enum - это будет намного легче читать код без него :)

+0

В первом случае не будет 'if (foo.HasFlag (AmendmentTypeEnum.Item) && foo == AmendmentTypeEnum.Item1)' work? –

+1

@JimMischel: Вы имели в виду '! ='? Если так, я согласен ... иначе, нет - это будет делать противоположное тому, что требуется. –

+0

Да, я имел в виду '! ='. –

0

Другим вариантом было бы установить флаги, означающие комбинации вы заинтересованы.

var flagComboA = AmendmentTypeEnum.Item1; 
var flagComboB = AmendmentTypeEnum.Item2 | AmendmentTypeEnum.Item6; 

if(foo == flagComboA || foo == flagComboB) 
{ 
    //DO NOT ALLOW 
} 
Смежные вопросы