[英]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.