[C#]運用逐位運算子的概念實作權限功能
一般在實做權限功能的時候,資料表的設計最直覺的做法,可能是有多少權限開多少boolin的欄位。但這個作法有一個問題,假設一開始我們的系統只有三個權限,分別是permission1,permission2,permission3,但今天客戶突然要再多一個權限permission4,此時我們資料表的欄位就不夠使用了,資料表需要再加一個為boolin的欄位permission4,以此類推,若未來一直不斷有新增權限出現,不就要一直不斷變更資料表的設計嗎?
因此我們需要改變設計方式,將資料類型boolin改為bigint,這樣我們只需要留一個欄位就可以存所有的權限,利用2進位的思考模式 permission1我們定義他的值為二進位的(1),permission2(10),permission3(100),若此時我們的使用者三個權限都有,就是1+10+100=111,再將二進位轉為10進位存入資料庫111=>7,此時這個7就代表permission 1,2,3了。
實作:
static void Main(string[] args) { Console.WriteLine($"1<<0 :{1<<0}");//1 Console.WriteLine($"1<<1 :{1<<1}");//2 Console.WriteLine($"1<<2 :{1<<2}");//4 Console.WriteLine($"1<<3 :{1<<3}");//8 //has permission 1,2 (value:1+2=3) var permissionvalue = 3; var haspermission1 = ((TestType)permissionvalue).HasFlag(TestType.permission1); Console.WriteLine("haspermission1:"); Console.WriteLine($"{haspermission1}"); var haspermission2 = ((TestType)permissionvalue).HasFlag(TestType.permission2); Console.WriteLine("haspermission2:"); Console.WriteLine($"{haspermission2}"); //do permissionvalue have permission3? var haspermission3 = ((TestType)permissionvalue).HasFlag(TestType.permission3); Console.WriteLine("haspermission3:"); Console.WriteLine($"{haspermission3}"); Console.ReadLine(); } private enum TestType { None=0, permission1=1<<0, permission2=1<<1, permission3=1<<2, permission4=1<<3, }
留言
張貼留言