Список перечислений в битовую строку - PullRequest
0 голосов
/ 24 сентября 2018

Я создал флаги перечисления разрешений, которые контролируют доступ:

[Flags]
public enum PermissionEnum
{
    None = 0,
    Read = 1,
    Write = 2,
    Delete = 4,
    All = 7
}

Если кто-то запрашивает доступ, различные значения перечисления будут добавлены в список:

List<PermissionEnum> permissions = new List<PermissionEnum> { 1, 4 }

Как я могувыровнять список перечислений в битовую строку?Например,

[1,4] = "101"

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Вы делаете это неправильно.Вместо списка вы должны хранить в одной переменной PermissionEnum и для каждого добавляемого разрешения делать побитовое или:

PermissionEnum pe = PermissionEnum.None; //Current value:0

pe |= PermissionEnum.Read;  //Add Read permission. Current value: 1
pe |= PermissionEnum.Delete;//Add Delete permission. Current value: 5

Затем вы можете отобразить значение, преобразующее int в строку:

string result = Convert.ToString((int)pe, 2); //yields "101"

Чтобы удалить разрешение, используйте битовую and и битовую not

pe &= ~PermissionEnum.Read; //Removes Read permission. Current value: 4

Также, чтобы проверить, установлено ли какое-либо разрешение, используйте битовую and и проверьте, является либольше 0:

bool canRead = (pe & PermissionEnum.Read) > 0;
0 голосов
/ 24 сентября 2018

Шаг 1

Объедините ваш список флагов в одно значение перечисления:

PermissionEnum combined = permissions.Aggregate(PermissionEnum.None,
                                                (cmb, perm) => cmb | perm);

Шаг 2

Преобразуйте объединенное значение в битовую строку:

string bitString = Convert.ToString((int)combined, 2);

Обратите внимание, что если вы можете изменить интерфейс, чтобы просто получить комбинированное перечисление вместо списка, вы можете вообще избежать шага 1.

...