检查枚举标志是否包含某个标志值

时间:2019-06-16 17:49:28

标签: c# unity3d enums enum-flags

在C#中(使用Unity在游戏中工作),我有一个带有[Flag]属性的枚举。我已经实例化了两次。我想要一种比较两个枚举的方法。具体来说,如果枚举A(将具有多个标志)包含来自枚举B(仅将被分配一个标志)的标志。

不是试图将单个实例化的枚举与单个标志进行比较(已被多次回答)。

我怀疑可以通过使用GetValue转储值并在foreach循环中比较这些值来做到这一点,但是似乎应该有一种更直接的比较方法。

Town<-c("WATSONIA","NORTH MELBOURNE","MOONEE PONDS")
Latitude<-c("-37.71610","-37.80040","-37.76010")
Longitude<-c("145.0804","144.9544","144.9228")
pop<-c(1232131,213312,342344)
dt<-data.frame(Town,Latitude,Longitude,pop)
map <- ggplot() + geom_polygon(data = Vic, aes(x = long, y = lat, group = group), colour = "black", fill = pop)


map

我希望上面的代码检查电阻是否包含来自bilityType的标志。在上面的示例中,有问题的攻击将传入它的能力类型。如果该类型是水或刺穿,则应打印抵抗声明。如果是其他类型,则应该照常造成伤害。

2 个答案:

答案 0 :(得分:2)

这是您需要的:

if ((resistances & abilityType) != 0)
{
    print("You are resistance to this damage type");
}
...

答案 1 :(得分:2)

正如注释和其他答案所述,您要滥用的是按位&运算符,因为枚举基于int类型的(by default)进行比较。但是,自.NET 4.0开始,添加了Enum.HasFlag扩展方法,可以做到这一点并提高了可读性。

// These two are semantically equal

if (resistance.HasFlag(abilityType))
{
    print("You are resistance to this damage type");
}

if ((resistance & abilityType) != 0)
{
    print("You are resistance to this damage type");
}

其背后是许多其他人的解释。可以亲自推荐Alan Zucconi's Enum, Flags and bitwise operators

简短的版本是按位AND(&)运算符给出两个值“匹配”的结果,即它们都处于活动状态,一点一点地被激活。考虑它的一种方法是选择过滤器。要检查未知标志集的值A是否包含特定标志B,请使用过滤器,该过滤器仅允许标志B通过,并检查是否通过了检查,检查是否通过了检查表示为零以外的任何值。过滤器与您要查找的标志完全相同。因此,表达式变为(A & B) != 0。由于!=的优先级高于&,因此括号会强制覆盖操作的顺序。