架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 20557|回复: 3

[资料] C# Enum 简易权限设计 使用FlagsAttribute属性

[复制链接]
发表于 2019-4-22 14:30:51 | 显示全部楼层 |阅读模式
在C#中可以对整型运算对象按位进行逻辑运算。按位进行逻辑运算的意义是:依次取被运算对象的每个位,进行逻辑运算,每个位的逻辑运算结果是结果值的每个位。C#支持的位逻辑运算符如下图所示:

QQ截图20190422142649.jpg

基本權限設計:

///<summary>
///權限列舉
///</summary>
[FlagsAttribute]
publicenumPermissions
{
[Description("未設定")]
None=0,
[Description("建立")]
Create=1,
[Description("讀取")]
Read=2,
[Description("更新")]
Update=4,
[Description("刪除")]
Delete=8,
[Description("所有功能")]
All=Create|Read|Update|Delete
}



技巧一:利用2的次方值,來作為列舉值以便日後做位元運算(&AND、|OR、^XOR)。


技巧二:現有權限中,加入新權限動作。(OR運算)

Permissionspermission=Permissions.None;
permission=permission|Permissions.Create;
MessageBox.Show(permission.ToString());
//Result:Create

技巧三:加入【FlagsAttribute】標籤

Permissionspermission=Permissions.None;
permission=permission|Permissions.Create;
MessageBox.Show(permission.ToString());
//Result:Create([FlagsAttribute]不影響結果)

permission=permission|Permissions.Read;
MessageBox.Show(permission.ToString());
//Result:3(未加入[FlagsAttribute])
//Result:Create,Read(加入[FlagsAttribute])


技巧四:現有權限中,移除某個權限動作。(XOR與AND運算應用)

Permissionspermission=Permissions.None;
permission=permission|Permissions.Create;
MessageBox.Show(permission.ToString());
//Result:Create

permission=permission|Permissions.Read;
permission=permission|Permissions.Update;
MessageBox.Show(permission.ToString());
//Result:Create,Read,Update

permission=(permission&(Permissions.All^Permissions.Read));
MessageBox.Show(permission.ToString());
//Result:Create,Update


技巧五:判斷現在權限中,是否擁有某個權限(AND運算)

Permissionspermission=Permissions.None;
permission=permission|Permissions.Create;
MessageBox.Show(permission.ToString());
//Result:Create

permission=permission|Permissions.Read;
permission=permission|Permissions.Update;
MessageBox.Show(permission.ToString());
//Result:Create,Read,Update

permission=(permission&(Permissions.All^Permissions.Read));
MessageBox.Show(permission.ToString());
//Result:Create,Update

boolIsCreatable=false;
if((permission&Permissions.Create)==Permissions.Create)
{
IsCreatable=true;
}
else
{
IsCreatable=false;
}
MessageBox.Show(IsCreatable.ToString());
//Result:True

C#枚举中使用Flags特性,一个枚举变量存入多个值
https://www.itsvse.com/thread-4661-1-1.html
(出处: 架构师_程序员)







上一篇:System.MissingMethodException: 找不到方法:“Void Dapper.DynamicP...
下一篇:C#中virtual和(抽象)abstracth和接口(interface)的相同点与区别...
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-4-23 08:28:32 | 显示全部楼层
用心讨论,共获提升! - Tue Apr 23 2019 08:28:32 GMT+0800 (中国标准时间)
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-11-11 09:49:58 | 显示全部楼层
多选的枚举如何获取Description??
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2019-11-11 11:00:19 | 显示全部楼层
蓝天白云 发表于 2019-11-11 09:49
多选的枚举如何获取Description??

请参考下面文章

C# Enum枚举类型操作扩展类
https://www.itsvse.com/thread-7286-1-1.html
(出处: 架构师_程序员)
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2025-6-25 20:45

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表