C# - 如何以某种方式使用枚举标志

时间:2011-08-02 20:51:11

标签: c# bit-manipulation flags

我想做的是:

[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只能使用两次。这是解决这个问题的最好方法吗?或者我应该尝试创建一个让我处理这个问题的新对象?我想使用枚举来做到这一点,但我不能,为了我的生活,弄清楚如何做到这一点或在网上找到关于这样的事情。

提前感谢您提供的任何帮助。

4 个答案:

答案 0 :(得分:2)

枚举只指向一个动作。如果你有一系列动作,我可以建议一个集合来组织它们。

示例:

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

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

这将是所有1的组合。听起来有一个另一个变量决定了动作组合。因此,您可以为该值构建逻辑以返回正确的操作组合(如果存在)。

答案 1 :(得分:0)

  

我想用枚举来做这件事,但我不能......

您当然可以使用枚举类型为每个操作定义常量,但是您需要实现一些逻辑以强制执行规则。枚举类型不能单独执行此操作。您可以创建一个用于管理这些操作的类,这些操作使用枚举值来确定类型作为第一步,但是它需要维护某个状态以确定给定操作在给定时间是否有效。 / p>

答案 2 :(得分:0)

使用枚举标志,您无法将相同的值组合(或)两次,因此您无法执行您正在寻找的验证类型。您必须创建一个类或使用集合并应用规则逻辑。因为无论如何你必须这样做,你不必担心Flags属性。它对你没用。反正不是这种情况。

但是,如果您的案例仅限于您列出的四个示例,那么您可以使用包含四个值的枚举来表示每个案例中的一个。位标记在这里仍然没有用,但你可以通过枚举实现一些规则。

答案 3 :(得分: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;
        }