Что делать, если битовая маска (флаги) enum становится слишком большой

StackOverflow https://stackoverflow.com/questions/1060760

Вопрос

В моем приложении очень большой набор разрешений, которые я представляю с помощью перечисления Flags.Он быстро приближается к практической верхней границе длинного типа данных.И я вынужден в ближайшее время придумать стратегию перехода к другой структуре.Теперь я мог бы разбить этот список на более мелкие части, однако это уже лишь подмножество общих разрешений для нашего приложения на основе макета нашего приложения.Мы широко используем это различие для целей отображения при управлении разрешениями, и я бы предпочел не возвращаться к этому коду сейчас, если я могу этого избежать.

Кто-нибудь еще сталкивался с этой проблемой?Как ты это пережил?Общие примеры хороши, но меня больше всего интересует конкретный пример C #, если есть какие-либо языковые приемы, которые я могу использовать для выполнения работы.

Может быть необязательно, но вот список разрешений, определенных в настоящее время для той части приложения, с которой я работаю.

родовое слово
Это было полезно?

Решение

Я вижу значения по крайней мере из нескольких различных перечислений ...

Моя первая мысль заключалась в том, чтобы подойти к проблеме, разделив разрешения на логические группы (RuleGroupPermissions, RulePermissions, LocationPermissions, ...), а затем создав класс (WebAgentPermissions), предоставляющий свойство для каждого типа перечисления разрешений.

Поскольку значения разрешений кажутся повторяющимися, вы, вероятно, можете обойтись одним перечислением в конце:

родовое слово

Затем пусть класс WebAgentPermissions предоставит свойство для каждой области, в которой должны быть установлены разрешения;

родовое слово

Другие советы

В документации по языку сказано:

http://msdn.microsoft.com/en-us/ библиотека / system.flagsattribute.aspx

«Базовым типом является Int32, поэтому максимальный однобитовый флаг - 1073741824, и, очевидно, всего 32 флага для каждого перечисления».

Однако ... ОБНОВЛЕНО:

Комментатор верен. Проверьте это:

http://msdn.microsoft.com/en -us / library / ms182147 (VS.80) .aspx

Int32 - это только тип данных DEFAULT! Фактически вы можете указать Int64.

родовое слово

... допускает до 64 значений. Но это определенно кажется максимумом, после чего вы будете заниматься реинжинирингом. Не зная слишком много об остальной части вашего решения, я не могу точно сказать, что может подойти. Но массив (или хэш-карта) идентификаторов привилегий, вероятно, является наиболее естественным подходом.

Вы можете проверить класс BitArray .Возможно, вы воспользуетесь им в будущем.

Это оказалось более распространенной проблемой, чем я думал, когда я представлял классы CSS как типы флагов и было более 64 возможностей. Я взял все, что узнал из этого процесса, и превратил его в шаблон многократного использования, хотя, поскольку это структура, это шаблон типа копирования и вставки.

Это "перечислимый тип" генерального кода. Он использует либо BigFlags из BigInteger, либо, если вы не можете ссылаться на эту сборку, существует запасной вариант, который использует System.Numerics, просто отключив директиву препроцессора BitArray.

Он ведет себя замечательно как перечисление NUMERICS, даже определяет такие вещи, как Flags, HasFlag(...), GetNames(), GetValues(), TryParse(...), TypeConverter и т. д. хотя всегда как строковый или текстовый тип данных.

Вы предоставляете значения "enum" как элементы IConvertible. Комбинированные значения перечисления отображаются как свойства только для получения.

Чтобы использовать его, скопируйте и вставьте код, затем выполните поиск и замените в TypeConverter своим именем структуры, затем удалите перечисления в разделе IConvertible и добавьте свои значения.

Надеюсь, кому-нибудь это пригодится.

родовое слово

В C # одним из гибких способов представления значения, которое является своего рода перечислением, но более гибким, является представление его как статического класса с доступными предварительно приготовленными значениями, например:

родовое слово

Или просто разделите это на части;похоже, вы могли бы, если бы действительно старались.

Если бы я контролировал это приложение, я, вероятно, придумал бы общий набор разрешений (просмотр, добавление, редактирование, удаление, загрузка / импорт) и набор ресурсов (пользователи, роли, правила и т. д.).На веб-странице найдите тип ресурса, связанный с этой страницей, а затем проверьте разрешения.Возможно что-то вроде:

родовое слово

или

родовое слово

или даже

родовое слово

У вас есть несколько разрешений, которые не имеют смысла ни с чем другим (назначьте Permissoins пользователю, чтобы назвать его).Я не уверен, как бы я справился с этим, исходя из того, насколько мало я знаю о проблеме.

Я не был в такой ситуации.

Вот что я думаю: создать отдельные перечисления для каждой категории и принять их как параметры.

родовое слово

РЕДАКТИРОВАТЬ: посмотрите, как это делает messagebox.show.ОК, ОК Отмена отделена от Вопроса, Информация, Восклицательный знак.

Не ответ на ваш вопрос, а связанное с ним предложение: мы используем сдвиг битов для указания числовых значений, например:

родовое слово

Не так важно для первых десяти, но после этого становится действительно кстати.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top