繁体   English   中英

应该“或”与 .Net4 Hasflags 一起使用: enum.HasFlag(AccessRights.Read | AccessRights.Write)

[英]Should "or" work with .Net4 Hasflags: enum.HasFlag(AccessRights.Read | AccessRights.Write)

我正在尝试新的 HasFlags 功能,并想知道以下是否可行:

enum.HasFlag(AccessRights.Read | AccessRights.Write)

......因为它似乎没有......

 DBAccessRights rights = (DBAccessRights)permission.PermissionFlags;
  if (rights.HasFlag(DBAccessRights.WikiMode))
  {
     // works
  }


  if (rights.HasFlag(DBAccessRights.WikiMode | DBAccessRights.CreateNew))
  {
     // Doesn't work    
  }

  DBAccessRights flags = DBAccessRights.WikiMode | DBAccessRights.CreateNew;
  if (rights.HasFlag(flags))
  {
     // Doesn't work
  }

给定文档 ,如果该值同时具有这两个标志,则我希望它返回true。

如果你把它想测试你的值是否有任何的标志,你需要

value.HasFlag(AccessRights.Read) | value.HasFlag(AccessRights.Write)

如果您对它的可读性不够好,则可能要看一下我的“ 不受约束的旋律”项目。 碰巧它已经具有您想要的功能(作为Flags.cs扩展方法):

// Same as value.HasFlag(AccessRights.Read | AccessRights.Write)
value.HasAll(AccessRights.Read | AccessRights.Write)

// Same as value.HasFlag(AccessRights.Read) | value.HasFlag(AccessRights.Write)
value.HasAny(AccessRights.Read | AccessRights.Write)

国际海事组织,这将使情况更清楚。 他们还将避免装箱,并保持类型安全:)

MSDN

HasFlag方法返回以下布尔表达式的结果。

thisInstance和flag =标志

对于复杂的标志,例如AccessRights.Read | AccessRights.Write AccessRights.Read | AccessRights.Write ,这将检查是否存在所有 “包含”标志。

您可能要检查是否存在任何标志,在这种情况下,您可以执行以下操作:

myAccessRights & (AccessRights.Read | AccessRights.Write) != 0 

| 运算符是按位或。 这意味着如果Read为1且Write为2,则值Read | Write Read | Write为3(请参见其二进制表示形式)。 因此,仅当您的enum变量同时设置 ReadWrite HasFlag返回true。

另外,您可以颠倒表达式的顺序:

//returns true - a bit easier on the eye
(AccessRights.Read | AccessRights.Write).HasFlag(myAccessRights)

如果您具有读取” |“返回”,它将返回true。 写访问。 这在功能上将等效于:

//also returns true - as per @Ani's answer
myAccessRights & (AccessRights.Read | AccessRights.Write) != 0

编辑

如注释中所指出的,如果myAccessRights为空,则第一个表达式将返回true;如果myAccessRights不仅仅是Read和Write,则第一个表达式将返回false。

在标记的枚举中,您可以简单地执行以下操作:

(MyEnum01 & MyEnum02) != 0

如果有任何公共位,则将设置一个位,因此该数字不再为 0。如果没有公共位,则结果为 0。为此,标记为 0 的枚举应表示“无”。

这是通用枚举的静态方法和特定枚举的静态方法:

public static partial class UtilityMethods
{
    public static bool HasAnyFlags (Enum enumA, Enum enumB)
    {
        return ((int) (object) enumA & (int) (object) enumB) != 0;
    }

    public static bool HasAnyFlags (MyEnum enumA, MyEnum enumB)
    {
        return (enumA & enumB) != 0;
    }
}

您还可以创建自己的扩展方法:

public static partial class ExtensionMethods
{
    public static bool HasAnyFlag (this Enum e, Enum compared)
    {
        return ((int) (object) e & (int) (object) compared) != 0;
    }
}

对于通用枚举,我从这里进行了转换。 据称,使用 boxing 而不是Converter.ToInt32()来执行它的性能更高。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM