2014-11-21 51 views
0

我有一個相當大的標誌枚舉叫AmendmentType。我需要檢查一下,看看是否有特定的枚舉和其他。如果枚舉有特定的標誌,檢查它是否有其他人

例如:

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 
} 

這將如何可能呢? Flag Enum中有大約20個不同的項目,看起來應該比檢查所有可能的組合更簡單。

+0

爲什麼不只是'if(foo.HasFlag(1)|| foo.HasFlag(2)..)'等等? – DLeh 2014-11-21 21:20:29

+0

那麼你只是詢問「其他」部分? – 2014-11-21 21:21:41

+0

是的,我會檢查什麼來獲得「其他」? – 2014-11-21 21:22:21

回答

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)'工作嗎? – 2014-11-21 21:37:51

+1

@JimMischel:你的意思是'!='?如果是這樣,我同意......否則,不 - 它會做與需要相反的事情。 – 2014-11-21 21:38:37

+0

是的,我的意思是'!='。 – 2014-11-21 21:43:24

0

另一種選擇是設置一個表示你感興趣的組合標誌。

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

if(foo == flagComboA || foo == flagComboB) 
{ 
    //DO NOT ALLOW 
}