我正在尝试新的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
}
答案 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
变量设置为 Read
和Write
时才会返回true。