13

我有一个用 [Flags] 属性标记的枚举,如下所示:

[Flags]
public enum Tag : int
{
    None = 0,
    PrimaryNav = 1,
    HideChildPages = 2,
    HomePage = 4,
    FooterLink = 8
}

在我的站点地图中的站点地图节点上,我将标签组合的 int 值存储为属性。

我需要做的是检查节点是否具有一个或多个标签中的任何一个,例如 Tag.PrimaryNav | 标记.主页。

我正在努力使用必要的布尔逻辑来确定 Enum 值是否具有与之比较的一个或多个值。

如果不清楚,请道歉。如有必要,我可以提供更多信息。

4

8 回答 8

28

您可以通过将值与 组合|并检查来做到这一点&

要检查值是否包含一标签:

if ((myValue & (Tag.PrimaryNav | Tag.HomePage)) != 0) { ... }

|结合了您正在测试的枚举(按位)和通过按位掩码进行的测试&——如果结果不为零,则它至少设置了其中一个。

如果你想测试它是否同时设置了它们,你也可以这样做:

Tag desiredValue = Tag.PrimaryNav | Tag.HomePage;
if ((myValue & desiredValue) == desiredValue) { ... }

在这里,我们屏蔽了我们不关心的任何内容,并测试结果值是否等于我们关心的值(我们不能!= 0像以前那样使用,因为这将匹配任何一个值,而我们对两者都感兴趣)。

一些链接:

于 2010-03-09T12:45:57.157 回答
9

您可以使用 HasFlag 方法来避免对布尔逻辑的需要,

Tag Val = (Tag)9;

if (Val.HasFlag(Tag.PrimaryNav))
{
    Console.WriteLine("Primary Nav");
}

if(Val.HasFlag(Tag.HomePage))
{
    Console.WriteLine("Home Page");
}
于 2010-03-09T12:50:26.457 回答
2

对于按位 ( 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) 
}
于 2010-03-09T12:48:30.960 回答
1
var someEnumValue = Tag.PrimaryNav | Tag.HomePage;

要测试枚举是否包含给定值:

if ((someEnumValue & Tag.PrimaryNav) == Tag.PrimaryNav)
{

}
于 2010-03-09T12:45:32.383 回答
1
var tag = Tag.HideChildPages | Tag.PrimaryNav;

If ((tag & Tag.PrimaryNav) == Tag.PrimaryNav) {
    // Tag.PrimaryNav set.
}
于 2010-03-09T12:45:51.853 回答
1

您可以使用 Jon Skeet 的Unconstrained Melody库:

var someEnumValue = Tag.PrimaryNav | Tag.HideChildPages;
someEnumValue.HasAny(Tag.PrimaryNav | Tag.HomePage); // Returns true
于 2010-03-09T12:52:24.600 回答
0

这是一个经典的扩展​​方法:

    public static bool HasFlag(this Enum val, Enum t)
    {
            return (Convert.ToUInt64(val) & Convert.ToUInt64(t)) != 0;
    }
于 2020-10-13T13:32:42.423 回答
0

您可以在枚举上使用此扩展方法,用于任何类型的枚举:

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;
    }
于 2016-09-28T07:02:38.293 回答