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

C# 检查枚举标志是否包含某个标志值,c#,unity3d,enums,enum-flags,C#,Unity3d,Enums,Enum Flags,在C#(在游戏中使用Unity)中,我有一个带有[Flag]属性的枚举。我已经实例化了两次。我想要一种比较这两个枚举的方法。特别是如果枚举A(将有多个标志)包含枚举B中的标志(该标志将仅被分配一个标志) 我没有尝试将单个实例化枚举与单个标志进行比较(这已被回答多次)。 我怀疑我可以通过使用GetValue转储值并在foreach循环中比较这些值来实现这一点,但似乎应该有一种更直接的比较方法 公共枚举能力类型 { 无=0, 皮尔斯=1以下是您需要的: if ((resistances &

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

我没有尝试将单个实例化枚举与单个标志进行比较(这已被回答多次)。

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

公共枚举能力类型
{
无=0,
皮尔斯=1以下是您需要的:

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

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

//这两者在语义上是相等的
if(resistance.HasFlag(abilityType))
{
打印(“您可以抵抗这种损坏类型”);
}
如果((阻力和能力类型)!=0)
{
打印(“您可以抵抗这种损坏类型”);
}
这背后有很多人解释。可以亲自推荐


简短的版本是,按位AND(
&
)运算符给出两个值“匹配”的结果从某种意义上说,它们都是一点一点地活动的。一种将其视为选择性过滤器的方法。要检查未知标志集的值
a
是否包含特定的标志
B
,请使用只允许标志
B
通过的过滤器,并检查是否有任何内容通过,其中任何内容都表示为任何内容se大于零。筛选器与您要查找的标志完全相同。因此表达式变为
(A&B)!=0
。圆括号强制覆盖操作顺序,因为
!=
的优先级高于
&

这对您有用吗?听起来您需要按位操作。类似于
if(resistences&abilityType==abilityType)
…不在计算机上。不想听起来很霸道,但flags在互联网上被广泛记录。你可以用谷歌搜索“flag c#”,你很可能会找到一个快速的答案。可能是重复的。字面上,最上面的答案就是你想要的。@DrakeBarron“两个枚举”和“一个枚举加一个标记”之间没有任何区别.顺便说一下,表格
(a&b)!=0
和表格
(a&b)之间的差异==b
是第一个检查
b
的标志是否在
a
中设置了,第二个检查是否所有标志都设置了。谢谢你的回答,我会尝试一下。如果你有时间,你能解释一下背后的逻辑吗?我对逐位运算非常陌生,所以我还不能在头脑中完全解决这个问题。刚刚测试过-真的很有效!谢谢你的时间,陌生人。@DrakeBarron@Draco18s感谢你回答的质量和语调绝对糟糕-对其他人,衷心感谢你帮助我找到解决方案。这篇文章在我的任何搜索中都没有出现。你是说什么时候出现的?重复的存在是为了帮助修复搜索失败的事实。如果重复的问题实际上是重复的,请不要对此提出异议。您的问题是重复的,因为在dup目标上已经可以找到帮助您的答案。
Enum.HasFlag()
仅适用于标记有
FlagsAttribute
属性的枚举类型