簡體   English   中英

C# - 如何以某種方式使用枚舉標志

[英]C# - How to use enum flags in a certain way

我想做的是這樣的:

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

該對象的actions標志設置為7開始。 然后,該對象可以執行任何可用的操作。 但這里是踢球者。 該對象可以執行以下組合中的操作:

- 行動1,行動2,行動3

- 行動1,行動1,行動3

- 行動1,行動1,行動2

- 行動1,行動1,行動1

因此,動作2和3只能使用一次,而動作1可以使用,最多三次。 如果使用Action 2或Action 3,則Action 1只能使用兩次。 這是解決這個問題的最好方法嗎? 或者我應該嘗試創建一個讓我處理這個問題的新對象? 我想使用枚舉來做到這一點,但我不能,為了我的生活,弄清楚如何做到這一點或在網上找到關於這樣的事情。

提前感謝您提供的任何幫助。

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

例:

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

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

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

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

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

使用枚舉標志,您無法將相同的值組合(或)兩次,因此您無法執行您正在尋找的驗證類型。 您必須創建一個類或使用集合並應用規則邏輯。 因為無論如何你必須這樣做,你不必擔心Flags屬性。 它對你沒用。 反正不是這種情況。

但是,如果您的案例僅限於您列出的四個示例,那么您可以使用包含四個值的枚舉來表示每個案例中的一個。 位標記在這里仍然沒有用,但你可以通過枚舉實現一些規則。

我這樣做是為了讓它按照我想要的方式工作。

我仍然需要經歷並重構,但它到目前為止我的需要:

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;
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM