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

goo*_*ate 13 c# enums .net-4.0 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
  }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 30

鉴于文档,如果值具有这两个标志,我希望返回true .

如果您希望它测试您的值是否具有这些标志中的任何一个,那么您将需要它

value.HasFlag(AccessRights.Read) | value.HasFlag(AccessRights.Write)
Run Code Online (Sandbox Code Playgroud)

如果这对你来说不够好,你可能想看看我的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)
Run Code Online (Sandbox Code Playgroud)

那些会让它更清晰,IMO.他们也避免拳击,并且类型安全:)


Ani*_*Ani 20

来自MSDN:

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

thisInstance和flag = flag

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

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

myAccessRights & (AccessRights.Read | AccessRights.Write) != 0 
Run Code Online (Sandbox Code Playgroud)