如何确定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; }