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

我正在尝试新的HasFlagsfunction,并想知道以下是否应该工作:

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) 

如果这对你来说不够好,你可能想看看我的Unconstrained Melody项目。 碰巧已经有了你想要的function(作为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。 他们也避免拳击,并且类型安全:)

来自MSDN :

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

thisInstance和flag = 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) 

如果您有Read |,则返回true 写访问权限。 这在function上等同于:

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

编辑

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