简单比较枚举是否在枚举列表中

Xav*_*jer 7 c# enums

我有以下枚举:

public enum Materials { Wood, Stone, Earth, Water, Lava, Air }
Run Code Online (Sandbox Code Playgroud)

现在我有3个材料我可以走路(木石土)和3个不可走路(水熔岩空气)

我想比较一个标志是否是三个中的一个.

目前,我就是这样做的:

Materials myMat = Materials.Earth;
if ( myMat == Materials.Earth || myMat == Materials.Wood || myMat == Materials.Stone)
{
    I can walk on myMat...
}
Run Code Online (Sandbox Code Playgroud)

是不是可以创建一个新的标志,如Materials.Walkable,它将包括这三种材料,所以我可以使用

if ( myMat == Materials.Walkable )
Run Code Online (Sandbox Code Playgroud)

如果可以,我该怎么做?

提前致谢 ;)

Ani*_*Ani 13

您可以创建一个扩展方法:

public static bool IsWalkable(this Materials myMat )
{
    return myMat == Materials.Earth || myMat == Materials.Wood || myMat == Materials.Stone; 

    // alternatively:
    return new[] { Materials.Earth,  Materials.Wood,  Materials.Stone }.Contains(myMat);
}
Run Code Online (Sandbox Code Playgroud)

并将其用作:

Materials myMat = ...
bool isMyMatWalkable = myMat.IsWalkable();
Run Code Online (Sandbox Code Playgroud)

如果你愿意,你也可以使用[Flags]枚举:

[Flags]
public enum Materials
{
   None = 0,
   Wood = 1,
   Stone = 1 << 1,
   Earth = 1 << 2,
   Water = 1 << 3,
   Lava = 1 << 4,
   Air = 1 << 5,
   Walkable = Wood | Earth | Stone
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

Materials myMat = ..
bool isMyMatWalkable = (myMat & Materials.Walkable) != Materials.None;
Run Code Online (Sandbox Code Playgroud)