应该“或”使用.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
变量同时具有 Read
和Write
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。