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

时间:2011-11-02 17:05:36

标签: c# .net-4.0 enums enum-flags

我正在尝试新的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
  }

3 个答案:

答案 0 :(得分:30)

鉴于the documentation,如果值这两个,我希望返回true。

如果您希望它测试您的值是否 这些标志,那么您需要

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

如果这对您来说不够好,您可能需要查看我的Unconstrained Melody项目。它恰好已经具有您想要的功能(作为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)

那些会让它变得更加清晰,IMO。他们也避免拳击,并且是类型安全的:)

答案 1 :(得分:20)

来自MSDN

  

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

     

thisInstance和flag = flag

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

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

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

答案 2 :(得分:3)

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