[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,
        }

結果:




留言

這個網誌中的熱門文章

[Visual Studio]位於網際網路或是限制區域上 或是檔案上標有 web 字樣 所以無法處理該檔案。若希望處理這些檔案 請移除 web 字樣。

[IIS] IIS執行時,發生拒絕存取路徑 問題

[windows] xcopy 備份至 「網路磁碟機」