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;

Кто-либо может предоставить мне некоторое знание этой реализации?

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

Daoming

6
задан Winston Smith 29 January 2010 в 12:18
поделиться

2 ответа

В данном примере используется оператор битового сдвига: "<<". Этот оператор берёт биты и сдвигает их. Например, "1 << 3" приводит к цифре 8. Таким образом, в двоичном варианте

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

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

myRole = customer | employee = 0011

Если-выставленное вами значение предназначено для того, чтобы сказать, есть ли у кого-то определенная роль. Она использует битовую и: "&". Bitwise-и объединяет эти два числа, устанавливая бит только в том случае, если бит установлен в обоих операндов.

2
ответ дан 8 December 2019 в 12:59
поделиться

Они используют 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, то оператор & вернет все совпадающие биты.

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

.
16
ответ дан 8 December 2019 в 12:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: