Jon*_*gel 8 .net c# enums flags
如果我有一个enum
标记的[Flags]
,有没有办法在.NET中测试这种类型的值,看它是否只包含一个值?我可以使用位计数得到我想要的结果,但如果可能的话我宁愿使用内置函数.
在enum
动态循环遍历值时,Enum.GetValues()
也会返回组合标志.enum
在以下示例中调用该函数将返回4个值.但是,我不希望内部算法中包含值组合.测试单个enum
值的相等性是不合适的,因为它enum
可能包含许多值,并且在enum
更改中的值时还需要额外的维护.
[Flags]
enum MyEnum
{
One = 1,
Two = 2,
Four = 4,
Seven = One | Two | Four,
}
void MyFunction()
{
foreach (MyEnum enumValue in Enum.GetValues(typeof(MyEnum)))
{
if (!_HasSingleValue(enumValue)) continue;
// Guaranteed that enumValue is either One, Two, or Four
}
}
private bool _HasSingleValue(MyEnum value)
{
// ???
}
Run Code Online (Sandbox Code Playgroud)
Hen*_*rik 17
您可以将其投射到int
并使用Bit Twiddling Hacks中的技术来检查它是否是2的幂.
int v = (int)enumValue;
return v != 0 && (v & (v - 1)) == 0;
Run Code Online (Sandbox Code Playgroud)