2013-08-01 24 views
6

Nếu tôi đã enumKiểm tra nếu enum là một trong các quốc gia mong muốn

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

Có thể kiểm tra xem enum là trong hoặc một trong số các quốc gia mong muốn với một tấm séc duy nhất? Ví dụ nếu tôi muốn kiểm tra xem enum's là Normal hoặc NormalNoMove thì tôi có phải viết nó như thế này không?

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

Nó không phải là vấn đề lớn nếu chỉ có hai giá trị nhưng sẽ có nhiều trạng thái enum hơn và sẽ tốt hơn nếu tôi chỉ phải thay đổi nó ở một nơi. Có phải bằng cách nào đó có thể tạo một bí danh enum trả về true nếu giá trị enum là Normal hoặc NormalNoMove không? Hoặc tôi có phải viết một số loại phương pháp trợ giúp để đạt được điều đó (phương pháp khuyến nông?)

+0

Tôi cho rằng luồng là loại GameFlow? –

+0

Vâng, đó là loại GameFlow – kasztelan

Trả lời

7

Logic bitwise sẽ hoạt động trên các enums cờ như thế này.

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

Cũng có thể tạo giá trị enum kết hợp các giá trị khác, như tôi đề cập đến here.

Vì vậy, trong trường hợp của bạn:

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

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

Và một thử nghiệm 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 

} 

Dựa trên nhận xét của bạn, tôi đang tự hỏi nếu bạn cần rà soát lại những lá cờ Bitwise đây, quá. Có vẻ như "Bình thường" là trạng thái bạn muốn kiểm tra và "NormalNoMove" được xây dựng trên đó. Có lẽ enum của bạn sẽ giống như thế này:

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

Bằng cách đó, bạn có thể kiểm tra xem flow & GameFlow.Normal > 0 để xem nếu bạn đang ở một trong hai trạng thái bình thường: NormalNoMove chỉ là "mở rộng" Normal, vì vậy để nói chuyện.

+0

Vâng, tôi biết điều đó nhưng tôi vẫn phải sử dụng rõ ràng Normal và NormalNoMove ở mọi nơi tôi đang kiểm tra điều kiện. Tôi đã hy vọng có một cách để tạo ra một trạng thái enum khác, ví dụ NormalState sẽ trả về true trong điều kiện kiểm tra nếu giá trị là Normal hoặc NormalNoMove – kasztelan

+0

@kasztelan: Tôi mở rộng câu trả lời của tôi để giải quyết nhận xét của bạn. – StriplingWarrior

+0

Cảm ơn bạn! '(flow & GameFlow.AnyNormal)> 0;' là câu trả lời tôi đang tìm kiếm. Bằng cách này nếu tôi muốn mở rộng AnyNormal với trạng thái thứ ba, tôi sẽ phải thay đổi tuyên bố của nó trong enum. Hoàn hảo! – kasztelan

1

Dựa trên một bình luận cho câu trả lời @ StringlingWarrior, bạn chỉ có thể tạo ra một phương pháp mở rộng đó sẽ rút ngắn mã của bạn:

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

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

Cảm ơn bạn nhưng may mắn thay tôi không phải tạo phương thức mở rộng, phần' (flow & GameFlow.AnyNormal)> 0; 'là một phần không thể tránh khỏi những gì tôi đang tìm kiếm – kasztelan

1

Bạn có thể thiết lập một biến bằng GameFlow.NormalGameFlow.NormalNoMove và sau đó so sánh giá trị bạn phải làm như vậy:

GameFlow NormalOrNormalNoMove = GameFlow.Normal | GameFlow.NormalNoMove; 
... 
if ((Flow & NormalOrNormalNoMove) > 0) 
{ 
    // Your code 
} 
Các vấn đề liên quan