如何确定Enum值是否具有与其进行比较的一个或多个值?
我有一个标有[Flags]属性的Enum,如下所示:
[Flags] public enum Tag : int { None = 0, PrimaryNav = 1, HideChildPages = 2, HomePage = 4, FooterLink = 8 }
在我的站点地图中的站点地图节点上,我将标签组合的int值存储为属性。
我需要做的是检查一个节点是否有一个或多个标签中的任何一个 ,例如Tag.PrimaryNav | Tag.HomePage。
我正在努力使用必要的布尔逻辑来确定Enum值是否具有与其进行比较的一个或多个值。
如果不清楚,请道歉。 如有必要,我可以提供更多信息。
您可以通过将值与|
组合来实现 并通过&
检查。
要检查值是否包含任一标记:
if ((myValue & (Tag.PrimaryNav | Tag.HomePage)) != 0) { ... }
|
将您正在测试的枚举(按位)和通过按位掩码的&
测试组合在一起 – 如果结果不为零,则至少设置其中一个。
如果你想测试它们是否同时设置,你也可以这样做:
Tag desiredValue = Tag.PrimaryNav | Tag.HomePage; if ((myValue & desiredValue) == desiredValue) { ... }
在这里,我们掩盖了我们不关心的任何东西,并测试结果值等于我们关心的东西(我们不能像之前那样使用!= 0
,因为这将匹配任何一个值,这里我们感兴趣的是两个 )。
一些链接:
-
&
运营商 -
|
操作者
您可以使用HasFlag方法来避免使用布尔逻辑,
Tag Val = (Tag)9; if (Val.HasFlag(Tag.PrimaryNav)) { Console.WriteLine("Primary Nav"); } if(Val.HasFlag(Tag.HomePage)) { Console.WriteLine("Home Page"); }
对于按位( Flags
)枚举,“任何”测试是!= 0,所以:
const Tag flagsToLookFor = Tag.PrimaryNav | Tag.HomePage; if ((node.Tag & flagsToLookFor) != 0) { // has some cross-over with PrimaryNav or HomePage (and possibly others too) }
var someEnumValue = Tag.PrimaryNav | Tag.HomePage;
要测试枚举是否包含给定值:
if ((someEnumValue & Tag.PrimaryNav) == Tag.PrimaryNav) { }
var tag = Tag.HideChildPages | Tag.PrimaryNav; If ((tag & Tag.PrimaryNav) == Tag.PrimaryNav) { // Tag.PrimaryNav set. }
你可以使用Jon Skeet的Unconstrained Melody库:
var someEnumValue = Tag.PrimaryNav | Tag.HideChildPages; someEnumValue.HasAny(Tag.PrimaryNav | Tag.HomePage); // Returns true
对于任何类型的枚举,您可以在枚举上使用此扩展方法:
public static bool IsSingle(this Enum value) { var items = Enum.GetValues(value.GetType()); var counter = 0; foreach (var item in items) { if (value.HasFlag((Enum)item)) { counter++; } if (counter > 1) { return false; } } return true; }