C #: побитовый оператор в enum (пользовательская авторизация в MVC) - PullRequest
5 голосов
/ 29 января 2010

Я сейчас читаю статью , но я не очень понимаю, как это работает с логическим оператором. Кто-нибудь может мне это объяснить?

например. Если я хочу иметь 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;

Кто-нибудь может дать мне некоторые знания об этой реализации?

Большое спасибо.

Daoming

Ответы [ 2 ]

13 голосов
/ 29 января 2010

Они используют 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

Таким образом, вы можете комбинировать две роли. Например, некоторые пользователи могут одновременно играть Employee и Supervisor, просто установив соответствующие биты.

А как проверить, установлен ли бит? Это именно то, что (Roles & role) != role) делает. Например:

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

Если вы тестируете пользовательскую переменную, чтобы проверить, установлен ли этот бит Employee, этот оператор & вернет все совпадающие биты.

Надеюсь, эта помощь; не стесняйтесь редактировать этот ответ

1 голос
/ 29 января 2010

В этом примере используется оператор побитового сдвига: «<<». Этот оператор берет биты и сдвигает их. Например, «1 << 3» приводит к числу 8. Итак, в двоичном виде, </p>

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

Теперь вы можете назначать людям несколько ролей, используя побитовый оператор или. Это будет одна вертикальная черта "|". Побитовое или объединяет два числа побитно, устанавливая каждый бит, установленный в любом из двух операндов.

myRole = customer | employee = 0011

Ваше if-утверждение предназначено для того, чтобы определить, выполняет ли кто-то определенную роль Он использует поразрядно-и: "&". Побитовый - и объединяет два числа, устанавливая бит только в том случае, если бит установлен в обоих операндах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...