using System.Collections;
public static void Main()
var userState = new UserState { Roles = Types.Roles.Admin | Types.Roles.Cashier };
userState.Permissions.SetPermission(Types.Permissions.AcceptCash);
userState.Permissions.SetPermission(Types.Permissions.AcceptCreditCard);
userState.Permissions.SetPermission(Types.Permissions.CanAlsoDoThis);
Console.WriteLine($"Has Admin Role: {userState.Roles.HasFlag(Types.Roles.Admin)}");
Console.WriteLine($"Has Cashier Role: {userState.Roles.HasFlag(Types.Roles.Cashier)}");
Console.WriteLine($"Has Clerk Role: {userState.Roles.HasFlag(Types.Roles.Clerk)}");
Console.WriteLine($"Accept Cash: {userState.Permissions.HasFlag(Types.Permissions.AcceptCash)}");
Console.WriteLine($"Accept Paper Check: {userState.Permissions.HasFlag(Types.Permissions.AcceptPaperCheck)}");
Console.WriteLine($"Accept Credit Card: {userState.Permissions.HasFlag(Types.Permissions.AcceptCreditCard)}");
Console.WriteLine($"Can Also Do This: {userState.Permissions.HasFlag(Types.Permissions.CanAlsoDoThis)}");
var userStateSerialized = JsonConvert.SerializeObject(userState);
Console.WriteLine(userStateSerialized);
var userStateDeserialized = JsonConvert.DeserializeObject<UserState>(userStateSerialized);
Console.WriteLine($"Accept Cash: {userStateDeserialized.Permissions.HasFlag(Types.Permissions.AcceptCash)}");
Console.WriteLine($"Accept Paper Check: {userStateDeserialized.Permissions.HasFlag(Types.Permissions.AcceptPaperCheck)}");
Console.WriteLine($"Accept Credit Card: {userStateDeserialized.Permissions.HasFlag(Types.Permissions.AcceptCreditCard)}");
Console.WriteLine($"Can Also Do This: {userStateDeserialized.Permissions.HasFlag(Types.Permissions.CanAlsoDoThis)}");
public Permissions(byte[] permissionData = null)
PermissionsData = permissionData?.Length > 0 ? new BitArray(permissionData) : new BitArray(1000);
public BitArray PermissionsData { get; private set; }
public bool HasFlag(Types.Permissions permissionType)
return PermissionsData[(int)permissionType];
internal void SetPermission(Types.Permissions permissionType)
PermissionsData[(int)permissionType] = true;
public enum Roles : Int64
public Permissions Permissions { get; private set; } = new Permissions(null);
public Types.Roles Roles { get; set; }
private byte[] PermissionsData
var permissionsArray = new byte[(int)Math.Ceiling(Permissions.PermissionsData.Length / 8d)];
Permissions.PermissionsData.CopyTo(permissionsArray, 0);
Permissions = new Permissions(value);