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