Как использовать флаги перечисления определенным образом - PullRequest
3 голосов
/ 03 августа 2011

То, что я пытаюсь сделать, это:

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

Для объекта установлен флаг действий, установленный в 7. Затем объект может выполнить любое из доступных действий. Но вот кикер. Объект может выполнять действия в этой комбинации:

-Действие 1, Действие 2, Действие 3

-Действие 1, Действие 1, Действие 3

-Действие 1, Действие 1, Действие 2

-Действие 1, Действие 1, Действие 1

Таким образом, действия 2 и 3 могут использоваться только один раз, в то время как действие 1 может использоваться до трех раз. Если используется действие 2 или действие 3, то действие 1 можно использовать только дважды. Это лучший способ сделать это? Или я должен попытаться создать новый объект, который позволит мне справиться с этим? Я хотел бы использовать перечисления для этого, но я не могу, на всю жизнь, понять, как это сделать, или найти что-нибудь в Интернете о чем-то подобном.

Заранее благодарю за любую помощь, которая может быть оказана.

Ответы [ 4 ]

2 голосов
/ 03 августа 2011

Перечисления указывают только на одно действие.Если у вас есть комбинация действий, я могу предложить коллекцию для их организации.

Пример:

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

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

Это будет комбинация для всех единиц.Похоже, есть еще одна переменная, которая определяет комбинации действий.Таким образом, вы можете встроить логику для этого значения, чтобы оно возвращало правильную комбинацию действий (если она существует).

0 голосов
/ 03 августа 2011

Я сделал это, чтобы заставить работать так, как я хотел.

Мне все еще нужно пройти и выполнить рефакторинг, но пока он работает для моей потребности:

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 голосов
/ 03 августа 2011

С флагами enum вы не можете комбинировать (ИЛИ) одно и то же значение дважды, и поэтому вы не можете выполнить тот тип проверки, который вы ищете. Вам нужно будет создать класс или использовать коллекцию и применить свою логику правил. Так как вы все равно должны это делать, вам не нужно беспокоиться об атрибуте Flags. Это не будет полезно для вас. Во всяком случае, не в этом случае.

Но если ваши дела ограничены четырьмя примерами, которые вы перечисляете, то у вас может быть перечисление с четырьмя значениями, представляющими одно из каждого дела. Пометка битов здесь по-прежнему бесполезна, но вы можете применить некоторые правила через enum.

0 голосов
/ 03 августа 2011

Я бы хотел использовать перечисления для этого, но я не могу ...

Вы, конечно, можете использовать перечислимый тип для определения константы для каждого действия, но вам нужно будет реализовать некоторую логику для обеспечения соблюдения ваших правил. Перечислимый тип не может сделать это один. Вы можете создать класс, используемый для управления этими действиями, который использует перечисляемое значение для определения типа в качестве первого шага, но ему нужно будет поддерживать некоторое состояние, чтобы определить, является ли данное действие допустимым в данный момент времени.

...