2010-01-29 17 views
4

我目前正在阅读an article,但我并不真正了解这是如何与逻辑运算符一起工作的。任何人都可以向我解释这个吗?C#:enum中的按位运算符(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; 

任何人都可以提供一些这方面的知识吗?

非常感谢。

道明

+0

你似乎对什么是“逻辑”和“位”运算符感到困惑。使用错误的术语会使您难以找到正确的信息。 – 2010-01-29 00:53:00

+0

@Anon,谢谢你。我现在明白这一点。 – 2010-01-29 12:16:45

回答

1

这个例子使用按位移位运算符: “< <”。该操作员获取并移动它们。例如,“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语句旨在告诉某人是否有特定的角色。它使用按位和:“&”。按位 - 组合这两个数字,只有在两个操作数中都设置了该位时才设置一个位。

13

他们使用enum作为位图:如果设置了特定位,那么您就拥有该特权。他们也使用左移运算符。让我尝试所有一次证明:

 
Role   Decimal Binary Shifted Decimal 
--------  ------- ------ ------- ------- 
Customer = 1 = 000001 = 000001 = 1 
Employee = 1 = 000001 = 000010 = 2 
Supervisor = 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位被置位,即&运营商将返回所有匹配位。

希望得到这个帮助;随意编辑这个答案