2013-08-01 76 views
6

之一。如果我有枚舉檢查枚舉是在理想狀態

[Flags] 
    public enum GameFlow 
    { 
     Normal = 1, 
     NormalNoMove = 2, 
     Paused = 4, 
     Battle = 8 
    } 

是否有可能來檢查枚舉是在任何一張支票所需的國家之一?例如,如果我想檢查枚舉是Normal還是NormalNoMove,我是否總是要這樣寫呢?

if(Flow == GameFlow.Normal || Flow == GameFlow.NormalNoMove) 

如果只有兩個值,但會有更多的枚舉狀態,這將是很好,如果我只是將不得不改變它在一個地方,這不是一個大問題。如果枚舉值是Normal或NormalNoMove,那麼是否有可能使枚舉別名返回true?或者我必須寫一些輔助方法來實現(擴展方法?)

+0

我想Flow是GameFlow類型的? –

+0

是的,它是GameFlow類型 – kasztelan

回答

7

按位邏輯應該在標誌枚舉上工作,像這樣。

if((Flow & (GameFlow.Normal | GameFlow.NormalNoMove)) > 0) 

它也可以創建結合其他值,因爲我提here枚舉值。

所以,你的情況:

[Flags] 
public enum GameFlow 
{ 
    Normal = 1, 
    NormalNoMove = 2, 
    Paused = 4, 
    Battle = 8, 
    AnyNormal = Normal | NormalNoMove 
} 

bool IsNormal(GameFlow flow) 
{ 
    return (flow & GameFlow.AnyNormal) > 0; 
} 

並有LINQPad測試:

void Main() 
{ 
    IsNormal(GameFlow.Normal).Dump();// True 
    IsNormal(GameFlow.NormalNoMove).Dump();// True 
    IsNormal(GameFlow.Paused).Dump();// False 
    IsNormal(GameFlow.Battle).Dump();// False 

    IsNormal(GameFlow.Normal | GameFlow.Paused).Dump();// True 
    IsNormal(GameFlow.NormalNoMove | GameFlow.Battle).Dump();// True 
    IsNormal(GameFlow.Paused | GameFlow.Battle).Dump();// False 
    IsNormal(GameFlow.Battle | GameFlow.Normal).Dump();// True 

} 

基於您的評論,我想知道,如果你要在這裏修改按位標誌,太。這聽起來像「正常」是你想檢查的狀態,「NormalNoMove」建立在此。也許你應該枚舉看起來更像是這樣的:

[Flags] 
public enum GameFlow 
{ 
    Normal = 1, 
    NormalNoMove = Normal | 2, 
    Paused = 4, 
    Battle = 8 
} 

這樣的話,你可以檢查是否flow & GameFlow.Normal > 0,看看你在任何正常狀態:NormalNoMove只是「擴展」 Normal,可以這麼說。

+0

是的,我知道,但我仍然必須在每個我正在進行條件檢查的地方明確使用Normal和NormalNoMove。我希望有一種方法來創建另一個枚舉狀態,例如NormalState,它將在條件檢查中返回true,如果值是Normal或NormalNoMove – kasztelan

+0

@kasztelan:我擴展了我的答案以解決您的評論。 – StriplingWarrior

+0

謝謝! '(flow&GameFlow.AnyNormal)> 0;'是我正在尋找的答案。這樣,如果我想要以第三個狀態擴展AnyNormal,我將不得不改變它在枚舉中的聲明。完善! – kasztelan

1

基於對@ StringlingWarrior的答案評論,你可以只創建一個擴展方法,將縮短你的代碼:

public static class GameFlowExtensions 
{ 
    public static bool IsNormal(this GameFlow flow) 
    { 
     return (flow & (GameFlow.Normal | GameFlow.NormalNoMove)) > 0; 
    } 
} 

// usage: 
if (Flow.IsNormal()) 
+0

謝謝,幸運的是我不必創建擴展方法,'(flow&GameFlow.AnyNormal)> 0;'部分是我想要的 – kasztelan

1

你可以設置一個變量等於GameFlow.NormalGameFlow.NormalNoMove,然後比較值你必須把它,像這樣:

GameFlow NormalOrNormalNoMove = GameFlow.Normal | GameFlow.NormalNoMove; 
... 
if ((Flow & NormalOrNormalNoMove) > 0) 
{ 
    // Your code 
}