我正在使用用 [Flags] 装饰的枚举来控制 MVC2 应用程序中的自动化。下面是我的代码示例:
[Flags]
public enum SecurityRoles
{
None = 0,
Executive = 1,
BackOffice = 2,
AccountManager = 4,
Consultant = 8,
Administrator = 16
}
[TestMethod]
public void MultipleSelectionsTest()
{
var requiredRoles = SecurityRoles.Executive | SecurityRoles.BackOffice;
var user1Roles = SecurityRoles.Executive | SecurityRoles.Administrator | SecurityRoles.BackOffice | SecurityRoles.Consultant;
var user1HasAccess = user1Roles.HasFlag(requiredRoles);
var user2Roles = SecurityRoles.Administrator | SecurityRoles.BackOffice | SecurityRoles.Consultant;
var user2HasAccess = user2Roles.HasFlag(requiredRoles);
Assert.IsTrue(user1HasAccess); //returns true
Assert.IsTrue(user2HasAccess); //returns false
}
如您所见,user2Roles 包含 BackOffice 角色,requiredRoles 也包含 BackOffice 角色,但是 user HasAccess 为 false。这是为什么?我缺少什么?用户 HasAccess 为 true。
如果我错了,请纠正我(因为我可能是这样),但是当您执行 Enum 标志检查时,.NET 本质上是对表示标志总和的整数进行二进制算术。
所以有SecurityRoles.Administrator | SecurityRoles.BackOffice | SecurityRoles.Consultant
与值为 26 或相同11010
以二进制形式。
当您调用 Enum.HasFlags 时,正在执行的操作是return thisInstance & flag == flag
因此,如果您要根据您所需的角色检查前面提到的标志集SecurityRoles.Executive | SecurityRoles.BackOffice
值为 3 或11
在二进制中,数学是这样的:
11010 - 26 Administrator | BackOffice | Consultant
00011 - 3 Executive | BackOffice
-----
00010 - 2 BackOffice which really doesn't mean anything useful
那么接下来就是26 & 3 == 3
是假的。
为了彻底起见,给出SecurityRoles.Executive | SecurityRoles.Administrator | SecurityRoles.BackOffice | SecurityRoles.Consultant
值为 27 或11011
在二进制中,数学是这样的:
11011 - 26 Executive | Administrator | BackOffice | Consultant
00011 - 3 Executive | BackOffice
-----
00011 - 3 Executive | BackOffice
那么接下来就是26 & 3 == 3
是真的。
像这样的扩展方法可能是值得的(未经测试)
public static bool HasFlags(this Enum source, Enum[] flags)
{
return flags.Any(f => source.HasFlag(f));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)