如果我有枚举
[Flags]
public enum GameFlow
{
Normal = 1,
NormalNoMove = 2,
Paused = 4,
Battle = 8
}
是否可以通过一次检查来检查枚举是否处于任何一种所需状态?例如,如果我想检查枚举是Normal还是NormalNoMove,我是否总是要这样写?
if(Flow == GameFlow.Normal || Flow == GameFlow.NormalNoMove)
如果只有两个值但是会有更多的枚举状态,这不是一个大问题,如果我只需要在一个地方更改它就会很好。如果枚举值是Normal或NormalNoMove,是否有可能使枚举别名返回true?或者我是否必须编写某种辅助方法来实现(扩展方法?)
答案 0 :(得分:9)
按位逻辑应该适用于这样的标志枚举。
if((Flow & (GameFlow.Normal | GameFlow.NormalNoMove)) > 0)
我也可以创建组合其他值的枚举值,我提到here。
所以,在你的情况下:
[Flags]
public enum GameFlow
{
Normal = 1,
NormalNoMove = 2,
Paused = 4,
Battle = 8,
AnyNormal = Normal | NormalNoMove
}
bool IsNormal(GameFlow flow)
{
return (flow & GameFlow.AnyNormal) > 0;
}
和LINQPad测试:
void Main()
{
IsNormal(GameFlow.Normal).Dump();// True
IsNormal(GameFlow.NormalNoMove).Dump();// True
IsNormal(GameFlow.Paused).Dump();// False
IsNormal(GameFlow.Battle).Dump();// False
IsNormal(GameFlow.Normal | GameFlow.Paused).Dump();// True
IsNormal(GameFlow.NormalNoMove | GameFlow.Battle).Dump();// True
IsNormal(GameFlow.Paused | GameFlow.Battle).Dump();// False
IsNormal(GameFlow.Battle | GameFlow.Normal).Dump();// True
}
根据你的评论,我想知道你是否应该在这里修改按位标志。听起来“正常”是你要检查的状态,而“NormalNoMove”就是建立在它上面的状态。也许你的枚举应该更像这样:
[Flags]
public enum GameFlow
{
Normal = 1,
NormalNoMove = Normal | 2,
Paused = 4,
Battle = 8
}
这样,您可以检查flow & GameFlow.Normal > 0
是否处于正常状态:NormalNoMove
只是“延伸”Normal
,可以这么说。
答案 1 :(得分:6)
也许有用
public static class EnumExtensions
{
public static bool IsOneOf(this Enum enumeration, params Enum[] enums)
{
return enums.Contains(enumeration);
}
}
// usage:
if(Flow.IsOneOf(GameFlow.Normal, GameFlow.NormalNoMove))
答案 2 :(得分:2)
基于对@ StringlingWarrior答案的评论,您可以创建一个缩短代码的扩展方法:
public static class GameFlowExtensions
{
public static bool IsNormal(this GameFlow flow)
{
return (flow & (GameFlow.Normal | GameFlow.NormalNoMove)) > 0;
}
}
// usage:
if (Flow.IsNormal())
答案 3 :(得分:1)
您可以将变量设置为等于GameFlow.Normal
和GameFlow.NormalNoMove
,然后比较您拥有的值,如下所示:
GameFlow NormalOrNormalNoMove = GameFlow.Normal | GameFlow.NormalNoMove;
...
if ((Flow & NormalOrNormalNoMove) > 0)
{
// Your code
}
答案 4 :(得分:0)
根据 C# 9,我将使用模式匹配编写类似的表达式。在这种情况下。
if(Flow is GameFlow.Normal or GameFlow.NormalNoMove)
{
// your code...
}