我有以下枚举:
[Flags]
public enum PermissionLevel {
User = 1,
Administrator = 2,
ITStaff = 3,
Manager = 4,
SuperAdministrator = 6,
}
当我做:
PermissionLevel permission = (PermissionLevel) dr.GetInt32(i);
我得到分配给权限对象随机许可值。 举例来说,如果我是6,我的权限对象返回“管理员|管理器”,我应该得到“超级管理员”。 当我投的实例回到整数返回6。
我缺少的东西吗?
你需要确保值的每个组合都是唯一的:
[Flags]
public enum PermissionLevel {
User = 1,
Administrator = 2,
ITStaff = 4,
Manager = 8,
SuperAdministrator = 16
}
当你的枚举目前看,6可能意味着无论是SuperAdministrator
或Administrator | Manager
Administrator | Manager
。 4可以是Manager
或User | ITStaff
User | ITStaff
等。
没有什么乱了。 如果许可是6
,二进制值是110
。 有两个活动的标志(具有值1比特),4(经理)的值的比特,和2(管理员)。 在SuperAdministrator
的6值设置实际上是一个组合Manager
和Administrator
。
有时候就是这样,你想要的行为,但它似乎并没有被你的情况。 然后,你应该改变你的枚举,以便每个值代表一个独特的一点,因为其他的答案证明。
当与标志装饰属性,你可以做你在做什么,这是完全正常的。该CLR是告诉你,分配给枚举实例值和管理员,经理......这就是垂直管是什么,一个位或运算符。
从MSDN页面MSDN标志属性
“考虑为常用的标志组合的枚举常量。例如,如果你已经使用了文件,它包含的枚举常量I / O操作的枚举读= 1,写= 2,考虑创建枚举常读写=读或写,它结合了读取和写入的标志。另外,用来标志结合位或操作可能会被认为是不应该被要求简单的任务,某些情况下的先进理念。”
你本可以很容易地已经宣布枚举,如下所示:
[Flags]public enum PermissionLevel
{
User = 1,
Administrator = 2,
ITStaff = User | Administrator,
Manager = 4,
SuperAdministrator = Administrator | Manager ,
}
哦,顺便说一句,它被认为是很好的做法,始终包括无值...
[Flags]public enum PermissionLevel
{
None = 0,
User = 1,
Administrator = 2,
ITStaff = User | Administrator,
Manager = 4,
SuperAdministrator = Administrator | Manager ,
}
这种技术是非常有用的,因为它允许客户端代码来测试针对使用语法简明地表达了实际业务意图的个体值的子集的候选值...假设candValue是核心个人价值观之一...
if ((candValue & PermissionLevel.SuperAdministrator) == candVal)
// tests to see if candValue is Administrator Or Manager
这将需要2点进行比较,如果你没有访问到所代表的超级管理员的掩码枚举值= 00000110