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

时间:2010-01-29 00:38:36

标签: c# asp.net-mvc operators

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

例如。如果我想与客户,员工,主管和管理员有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;

任何人都可以向我提供有关此实施的一些知识吗?

非常感谢。

道明

2 个答案:

答案 0 :(得分: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位,那么&运算符将返回所有匹配位。

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

答案 1 :(得分:1)

此示例使用按位移位运算符:“&lt;&lt;”。该运算符获取位并移位它们。例如,“1 <&lt; <3”导致数字8

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

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

myRole = customer | employee = 0011

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