What to do when bit mask (flags) enum gets too large

bitmask, c#, enums, permissions, types

Solution

I see values from at least a handful of different enumerations in there...

My first thought was to approach the problem by splitting the permissions up in logical groups (`RuleGroupPermissions`, `RulePermissions`, `LocationPermissions`, ...), and then having a class (`WebAgentPermissions`) exposing a property for each permission enum type.

Since the permission values seem repetitive, you could probably get away with a single enum in the end:

[Flags]
public enum Permissions
{
    View = 1,
    Add = 2,
    Edit = 4,
    Delete = 8
}

And then have the `WebAgentPermissions` class expose a property for each area where permissions are to be set;

class WebAgentPermissions
{
    public Permissions RuleGroup { get; set; }
    public Permissions Rule { get; set; }
    public Permissions Location { get; set; }
    // and so on...
}

Problem

I have a very large set of permissions in my application that I represent with a Flags enumeration. It is quickly approaching the practical upper bound of the long data type. And I am forced to come up with a strategy to transition to a different structure soon. Now, I could break this list down into smaller pieces, however, this is already just a subset of the overall permissions for our application, based on our applications layout. We use this distinction extensively for display purposes when managing permissions and I would rather not have to revisit that code at this time if I can avoid it. Has anybody else run into this issue? How did you get past it? General examples are fine, but I am most interested in a c# specific example if there are any language specific tricks that I can employ to get the job done. May not be neccessary, but here is the list of Permissions currently defined for the portion of the app I am dealing with. ``` //Subgroup WebAgent [Flags] public enum WebAgentPermission : long { [DescriptionAttribute("View Rule Group")] ViewRuleGroup = 1, [DescriptionAttribute("Add Rule Group")] AddRuleGroup = 2, [DescriptionAttribute("Edit Rule Group")] EditRuleGroup = 4, [DescriptionAttribute("Delete Rule Group")] DeleteRuleGroup = 8, [DescriptionAttribute("View Rule")] ViewRule = 16, [DescriptionAttribute("Add Rule")] AddRule = 32, [DescriptionAttribute("Edit Rule")] EditRule = 64, [DescriptionAttribute("Delete Rule")] DeleteRule = 128, [DescriptionAttribute("View Location")] ViewLocation = 256, [DescriptionAttribute("Add Location")] AddLocation = 512, [DescriptionAttribute("Edit Location")] EditLocation = 1024, [DescriptionAttribute("Delete Location")] DeleteLocation = 2048, [DescriptionAttribute("View Volume Statistics")] ViewVolumeStatistics = 4096, [DescriptionAttribute("Edit Volume Statistics")] EditVolumeStatistics = 8192, [DescriptionAttribute("Upload Volume Statistics")] UploadVolumeStatistics = 16384, [DescriptionAttribute("View Role")] ViewRole = 32768, [DescriptionAttribute("Add Role")] AddRole = 65536, [DescriptionAttribute("Edit Role")] EditRole = 131072, [DescriptionAttribute("Delete Role")] DeleteRole = 262144, [DescriptionAttribute("View User")] ViewUser = 524288, [DescriptionAttribute("Add User")] AddUser = 1048576, [DescriptionAttribute("Edit User")] EditUser = 2097152, [DescriptionAttribute("Delete User")] DeleteUser = 4194304, [DescriptionAttribute("Assign Permissions To User")] AssignPermissionsToUser = 8388608, [DescriptionAttribute("Change User Password")] ChangeUserPassword = 16777216, [DescriptionAttribute("View Audit Logs")] ViewAuditLogs = 33554432, [DescriptionAttribute("View Team")] ViewTeam = 67108864, [DescriptionAttribute("Add Team")] AddTeam = 134217728, [DescriptionAttribute("Edit Team")] EditTeam = 268435456, [DescriptionAttribute("Delete Team")] DeleteTeam = 536870912, [DescriptionAttribute("View Web Agent Reports")] ViewWebAgentReports = 1073741824, [DescriptionAttribute("View All Locations")] ViewAllLocations = 2147483648, [DescriptionAttribute("Access to My Search")] AccessToMySearch = 4294967296, [DescriptionAttribute("Access to Pespective Search")] AccessToPespectiveSearch = 8589934592, [DescriptionAttribute("Add Pespective Search")] AddPespectiveSearch = 17179869184, [DescriptionAttribute("Edit Pespective Search")] EditPespectiveSearch = 34359738368, [DescriptionAttribute("Delete Pespective Search")] DeletePespectiveSearch = 68719476736, [DescriptionAttribute("Access to Search")] AccessToSearch = 137438953472, [DescriptionAttribute("View Form Roles")] ViewFormRole = 274877906944, [DescriptionAttribute("Add / Edit Form Roles")] AddFormRole = 549755813888, [DescriptionAttribute("Delete UserFormRolesDifferenceMasks")] DeleteFormRole = 1099511627776, [DescriptionAttribute("Export Locations")] ExportLocations = 2199023255552, [DescriptionAttribute("Import Locations")] ImportLocations = 4398046511104, [DescriptionAttribute("Manage Location Levels")] ManageLocationLevels = 8796093022208, [DescriptionAttribute("View Job Title")] ViewJobTitle = 17592186044416, [DescriptionAttribute("Add Job Title")] AddJobTitle = 35184372088832, [DescriptionAttribute("Edit Job Title")] EditJobTitle = 70368744177664, [DescriptionAttribute("Delete Job Title")] DeleteJobTitle = 140737488355328, [DescriptionAttribute("View Dictionary Manager")] ViewDictionaryManager = 281474976710656, [DescriptionAttribute("Add Dictionary Manager")] AddDictionaryManager = 562949953421312, [DescriptionAttribute("Edit Dictionary Manager")] EditDictionaryManager = 1125899906842624, [DescriptionAttribute("Delete Dictionary Manager")] DeleteDictionaryManager = 2251799813685248, [DescriptionAttribute("View Choice Manager")] ViewChoiceManager = 4503599627370496, [DescriptionAttribute("Add Choice Manager")] AddChoiceManager = 9007199254740992, [DescriptionAttribute("Edit Chioce Manager")] EditChoiceManager = 18014398509481984, [DescriptionAttribute("Delete Choice Manager")] DeleteChoiceManager = 36028797018963968, [DescriptionAttribute("Import Export Choices")] //57 ImportExportChoices = 72057594037927936 } ```

Original source