采用按位与(&)按位或(|)进行权限检查的简单例子

最近,做了些关于权限的功能模块。平时,很少用到按位或(|)按位与(&)这样的符号,尤其是连用的情况。

今天就针对这种情况做了个简单的例子,希望能帮助初接触这类符号的人。

先看例子的界面,然后针对界面我再进行实例功能的简单介绍。

左侧是我定义的几个简单的权限项,右侧是定义的用户具有的权限项。左右按钮是用来对用户当前的权限进行添加删除操作的。下方的测试是用来检测我们给用户添加的权限是否正确。(如下图)

下面我们看一下代码实现:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace PowerTest
{
    public partial class FormMain : Form
    {
        [Flags]
        public enum Power : uint
        {
            None = 0x00000000,
            Read = 0x00000001,
            Write = 0x00000002,
            Modify = 0x00000004,
            Delete = 0x00000010,
        }

        Power power;

        public FormMain()
        {
            InitializeComponent();
        }

        private void FormMain_Load(object sender, EventArgs e)
        {
            listBox_AllPower.Items.Add("Read");
            listBox_AllPower.Items.Add("Write");
            listBox_AllPower.Items.Add("Modify");
            listBox_AllPower.Items.Add("Delete");

            comboBox_HasPower.Items.Add("Read");
            comboBox_HasPower.Items.Add("Write");
            comboBox_HasPower.Items.Add("Modify");
            comboBox_HasPower.Items.Add("Delete");
        }

        private void button_Add_Click(object sender, EventArgs e)
        {
            if (listBox_AllPower.SelectedItem == null)
                return;

            listBox_MyPower.Items.Add(listBox_AllPower.SelectedItem);
            listBox_AllPower.Items.Remove(listBox_AllPower.SelectedItem);

            power = Power.None;

            foreach (object obj in listBox_MyPower.Items)
            {
                switch (obj.ToString())
                {
                    case "Read":
                        power = power | Power.Read;
                        break;
                    case "Write":
                        power = power | Power.Write;
                        break;
                    case "Modify":
                        power = power | Power.Modify;
                        break;
                    case "Delete":
                        power = power | Power.Delete;
                        break;
                }
            }
        }

        private void button_Delete_Click(object sender, EventArgs e)
        {
            if (listBox_MyPower.SelectedItem == null)
                return;

            listBox_AllPower.Items.Add(listBox_MyPower.SelectedItem);
            listBox_MyPower.Items.Remove(listBox_MyPower.SelectedItem);

            power = Power.None;

            foreach (object obj in listBox_MyPower.Items)
            {
                switch (obj.ToString())
                {
                    case "Read":
                        power = power | Power.Read;
                        break;
                    case "Write":
                        power = power | Power.Write;
                        break;
                    case "Modify":
                        power = power | Power.Modify;
                        break;
                    case "Delete":
                        power = power | Power.Delete;
                        break;
                }
            }
        }

        private void button_PowerTest_Click(object sender, EventArgs e)
        {
            if (comboBox_HasPower.SelectedItem == null)
            {
                MessageBox.Show("请选择要测试的权限");
                return;
            }

            if (listBox_MyPower.Items.Count < 1)
            {
                MessageBox.Show("用户不具有任何权限");
                return;
            }

            switch (comboBox_HasPower.SelectedItem.ToString())
            {
                case "Read":
                    if ((power & Power.Read) > 0)
                        MessageBox.Show("用户具有Read权限");
                    else
                        MessageBox.Show("用户不具有Read权限");
                    break;
                case "Write":
                    if ((power & Power.Write) > 0)
                        MessageBox.Show("用户具有Write权限");
                    else
                        MessageBox.Show("用户不具有Write权限");
                    break;
                case "Modify":
                    if ((power & Power.Modify) > 0)
                        MessageBox.Show("用户具有Modify权限");
                    else
                        MessageBox.Show("用户不具有Modify权限");
                    break;
                case "Delete":
                    if ((power & Power.Delete) > 0)
                        MessageBox.Show("用户具有Delete权限");
                    else
                        MessageBox.Show("用户不具有Delete权限");
                    break;
            }
        }
    }
}

在最顶端,我们定义了权限项枚举类。

在对用户权限进行添加、删除操作时,我们使用了按位或(|)算法。

在验证用户是否具有指定权限时,我们使用了按位与(&)算法。


实例源代码下载

### 实现基于角色或用户权限的按钮控制 在C# WinForms应用程序中,为了实现基于角色或用户权限的按钮控制,可以通过编程方式动态调整界面元素的状态来匹配用户的访问级别。具体来说,在加载窗体时读取当前登录用户的权限信息,并据此设定各个控件(如按钮)的`Visible`属性`Enabled`属性。 对于WinForms应用程序而言,可以根据获取到的用户权限列表,控制按钮的可见性可用性[^1]。这意味着可以在用户登录成功之后立即查询其拥有的权限集合,并遍历整个表单上的所有控件,检查它们对应的权限是否存在于该集合内;如果不存在,则隐藏这些控件或将它们设为不可用状态。 下面是一个简单例子展示如何根据不同的用户角色显示或禁用按钮: ```csharp private void Form_Load(object sender, EventArgs e) { string[] userPermissions = GetUserPermissions(); // 假定这是一个返回字符串数组的方法 foreach (Control control in this.Controls) { Button button = control as Button; if(button != null &amp;&amp; !string.IsNullOrEmpty(button.Tag?.ToString())) { bool hasPermission = Array.Exists(userPermissions, permission =&gt; permission.Equals(button.Tag.ToString(), StringComparison.OrdinalIgnoreCase)); button.Visible = hasPermission; button.Enabled = hasPermission; } } } ``` 在此示例中,假设每个按钮都有一个唯一的标签(`Tag`)用于表示所需的最小权限名称。当窗体加载时,这段代码会迭代所有的子控件查找那些带有有效标签值的按钮,并依据用户实际具有的权限决定是否让这些按钮显现出来以及能否响应点击事件。 此外,还可以考虑采用更高级别的抽象层来进行权限验证工作,例如创建专门的服务类负责处理这类逻辑,从而使得业务规则更加清晰易懂并易于维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值