2011-08-02 44 views
3

使用枚舉的標誌是什麼,我想我要做到這一點:C# - 如何以某種方式

[Flags] 
public enum Actions 
{ 
    Action1 = 0x01, 
    Action2 = 0x02, 
    Action3 = 0x04 
} 

對象具有行動標誌設置爲7開始。然後該對象可以執行任何可用的操作。但這裏是踢球者。

-Action 1,操作2,操作3

-Action 1,動作1,動作3

-Action 1,動作1,動作2

:該對象可在該組合中執行的操作

清議1,動作1,動作1

所以,行動2和3只可使用一次,而動作1可以使用高達三倍。如果使用動作2或動作3,則動作1只能使用兩次。這是最好的方式去做這件事嗎?或者我應該嘗試創建一個能夠讓我處理這個問題的新對象?我想用枚舉來做到這一點,但我不能在我的生活中弄清楚如何做到這一點,或者在網絡上找到任何關於這樣的事情。

非常感謝您提供任何幫助。

+0

這似乎更容易有actionsLeft,被設定爲3和值減少外部跟蹤器在(常規,非標誌)枚舉中。 –

+0

請觀察我如何格式化您的代碼或查看http://stackoverflow.com/editing-help – Amy

+0

因此,如果我明白,您不僅要使用枚舉(標誌)來確定哪些操作是允許的,行動應該發生在? – CodingGorilla

回答

0

我鼓勵這樣做,讓它工作,我想如何。

我仍然需要經過和重構,但它迄今適合我的需要:

public Actions Actions{get; set;} 

public bool UseAction(Actions action) 
     { 
      bool mReturn = false; 

      if (action == Actions.Action2) 
      { 
       if ((this.Actions & Actions.Action2) == Actions.Action2) 
       { 
        mReturn = true; 
        this.Actions = this.Actions & ~action; 
       } 
       else if ((this.Actions & Actions.Action3) == Actions.Action3) 
       { 
        mReturn = true; 
        this.Actions = this.Actions & ~Actions.Action3; 
       } 
       else 
       { 
        mReturn = false; 
       } 
      } 
      else if (action == Actions.Action3) 
      { 
       if ((this.Actions & Actions.Action3) == Actions.Action3) 
       { 
        mReturn = true; 
        this.Actions = this.Actions & ~action; 
       } 
      } 
      else 
      { 
       if ((this.Actions & Actions.Action1) == Actions.Action1) 
       { 
        mReturn = true; 
        this.Actions = this.Actions & ~action; 
       } 
       else if ((this.Actions & Actions.Action3) == Actions.Action3) 
       { 
        mReturn = true; 
        this.Actions = this.Actions & ~Actions.Action3; 
       } 
       else if ((this.Actions & Actions.Action2) == Actions.Action2) 
       { 
        mReturn = true; 
        this.Actions = this.Actions & ~Actions.Action2; 
       } 
      } 

      return mReturn; 
     } 
0

我想用枚舉要做到這一點,但我不能......

您當然可以使用一個枚舉類型定義常量的每一個動作,但你需要實施一些邏輯來執行你的規則。枚舉類型不能單獨完成。您可以創建一個用於管理這些操作的類,該類使用枚舉值來確定類型作爲第一步,但需要維護某個狀態以確定給定操作在給定時間是否有效。

0

使用枚舉標誌不能合併(OR)兩次相同的值,所以你不能執行你正在尋找的驗證。您將不得不創建一個類或使用一個集合並應用您的規則邏輯。既然你必須這樣做,你不必擔心Flags屬性。它對你沒有用處。無論如何不是這種情況。但是,如果您的案例僅限於列出的四個示例,那麼您可以使用包含四個值的枚舉來表示每個案例之一。位標記在這裏仍然沒有用處,但是您可以通過枚舉實施一些規則。

2

該枚舉只指向一個動作。如果你有一些行動的組合,我可以建議一個集合來組織它們。

實施例:

List<Actions> _actionCombos = new List<Actions>(3); 

_actionsCombos.Add(Action.Action1); 
_actionsCombos.Add(Action.Action1); 
_actionsCombos.Add(Action.Action1); 

這將是對所有的1秒的組合。這聽起來像是另一個決定動作組合的變量。因此,您可以爲該值構建邏輯以返回適當的操作組合(如果存在)。