C# 枚举位域Flags

Flags特性:

场景:

菜单权限场景,通过枚举,添加/移除某个权限,判断是否也有该权限

AuthorityEnums:

注意:枚举值设置为2的幂,防止值冲突

    [Flags]
    public enum AuthorityEnums
    {
        Authority_01 = 1, //权限1
        Authority_02 = 2, //权限2
        Authority_03 = 4, //权限3
        Authority_04 = 8 //权限4
    }

program:

 static void Main(string[] args)
        {
            //模拟数据库当前权限总和
            int allAuthority = (int)(AuthorityEnums.Authority_01 | AuthorityEnums.Authority_04);

            //是否拥有权限
            bool isAuthority = IsAuthority(allAuthority, (int)AuthorityEnums.Authority_01);
            Console.WriteLine($"是否拥有权限1:{isAuthority}");
            isAuthority = IsAuthority(allAuthority, (int)AuthorityEnums.Authority_02);
            Console.WriteLine($"是否拥有权限2:{isAuthority}");
            isAuthority = IsAuthority(allAuthority, (int)AuthorityEnums.Authority_04);
            Console.WriteLine($"是否拥有权限4:{isAuthority}");

            //添加权限
            int result = SetAuthority(allAuthority, 1, (int)AuthorityEnums.Authority_03);
            Console.WriteLine($"当前权限:{result}");
            result = SetAuthority(allAuthority, 0, (int)AuthorityEnums.Authority_01);
            Console.WriteLine($"当前权限:{result}");
            Console.ReadKey();
        }

        /// <summary>
        /// 设置权限
        /// </summary>
        /// <param name="AllAuthority">现有权限总和</param>
        /// <param name="Action">取消或设置操作(0取消,1设置)</param>
        /// <param name="currentAuthority">设置操作对应的状态值</param>
        /// <returns></returns>
        public static int SetAuthority(int AllAuthority, int Action, int currentAuthority)
        {
            int NewStatus = AllAuthority;
            if (Action == 1)
            {
                //判断此权限串是否拥有相应操作,不包括时加入权限
                if ((AllAuthority & currentAuthority) <= 0)
                {
                    NewStatus = AllAuthority | currentAuthority;
                }
            }
            else
            {
                //判断此权限串是否拥有相应操作,有权限时移除权限
                if ((AllAuthority & currentAuthority) > 0)
                {
                    NewStatus = AllAuthority & ~currentAuthority;
                }
            }
            return NewStatus;
        }

        /// <summary>
        /// 判断是否拥有权限
        /// </summary>
        /// <param name="AllAuthority">现有权限总和</param>
        /// <param name="currentAuthority">查询权限值</param>
        /// <returns></returns>
        public static bool IsAuthority(int AllAuthority, int currentAuthority)
        {
            if ((AllAuthority & currentAuthority) == currentAuthority)
            {
                return true;
            }
            return false;
        }

输出:

 

扩展:

如果有这样需求:需要查询某个权限的所有用户,sql语句怎么写?

oracle语法:bitand(位与)、bitor(位或)

查询拥有Authority_03 权限的所有用户

select * from user where bitand(roles,1)=4;

查询拥有Authority_03 和Authority_01  权限的所有用户

select * from user where bitand(roles,1)=5;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值