C#:枚举中的按位运算符(MVC中的自定义授权)

我正在阅读一篇文章 ,但我真的不明白这是如何与逻辑运算符一起工作的。 任何人都可以向我解释这个吗?

例如。 如果我想与客户,员工,主管和管理员有4级证券。

[Serializable] [Flags] public enum WebRoles { customer= 1 << 0, employee= 1 << 1, supervisor = 1 << 2, Admin = 2 << 3 } 

然后我应该如何实现以下逻辑。

 if (Roles != 0 && ((Roles & role) != role)) return false; 

有人能为我提供一些这方面的知识吗?

非常感谢你。

道明

此示例使用按位移位运算符:“<<”。 该运算符获取位并移位它们。 例如,“1 << 3”会产生数字8.因此,在二进制中,

 customer = 0001 employee = 0010 supervisor = 0100 admin = 1000 (I think this was supposed to read 1 << 3) 

现在,您可以使用按位或运算符为人员分配多个角色。 这将是一个垂直条“|”。 逐位或逐位组合两个数字,设置在两个操作数中的任何一个中设置的每个位。

 myRole = customer | employee = 0011 

您拥有的if语句旨在告诉某人是否具有特定角色。 它使用按位和:“&”。 按位 - 并组合两个数字,仅在两个操作数中设置该位时设置一个位。

他们使用enum作为位图:如果设置了特定位,那么你就拥有了这个特权。 他们也使用左移操作员。 让我试着一下子展示这一切:

角色十进制二进制移位十进制
 -------- ------- ------ ------- -------
客户= 1 = 000001 = 000001 = 1
员工= 1 = 000001 = 000010 = 2
主管= 1 = 000001 = 000100 = 4
 Admin = 2 = 000010 = 010000 = 16

这样您就可以组合两个角色。 例如,某些用户可以同时玩EmployeeSupervisor ,只需设置相应的位。

以及如何检查是否设置了一个位? 这正是(Roles & role) != role) 。 例如:

 WebRoles user = WebRoles.Employee | WebRoles.Supervisor; bool isEmployee = (user & WebRoles.Employee) == WebRoles.Employee; // true 

如果测试用户变量以检查是否设置了Employee位,则该&运算符将返回所有匹配位。

希望这有帮助; 随时编辑这个答案