[2014-12-29]使用Enum位模式进行多重状态(或权限)管理
前言
对于Enum在AspNet Mvc中的应用,我之前提到一种扩展,如何在 Asp.net Mvc 开发过程中更好的使用Enum。这里将介绍另一种更好的使用Enum的方法。
Enum定义
以一个代表权限的枚举作为示例。
[Flags]
public enum RolePerm
{
View=1,
Add=2,
Edit=4,
Del=8
}
按位或赋值以及按位与验证
原理很简单,请自行复习位运算。简述如下:
按位或,两个bit只要有一个是1,则置1;
按位与,两个bit只要有一个是0,则置0。
示例代码:
class Program
{
static void Main(string[] args)
{
//初始化一个空Enum
var perm =new RolePerm();
Console.WriteLine((int)perm);//0
Console.WriteLine(perm.ToString());//0
//按位或
perm = RolePerm.View | RolePerm.Add;
Console.WriteLine((int)perm);//3
Console.WriteLine(perm.ToString());//View, Add
//tips:在asp.net mvc 的模型绑定阶段,表单或url中的字符串“View, Add”,
//可以被自动绑定到其对应的枚举类型参数中,请自行尝试
//按位与,验证是否有其中一个权限
if ((perm & RolePerm.Del)==RolePerm.Del)//false
{
Console.WriteLine("YES,有删除权限");
}
else
{
Console.WriteLine("NO,没有删除权限");
}
//按位与,验证是否有其中多个权限
perm = perm | RolePerm.Edit;//使perm不等于待比较的pend
var pend = RolePerm.View | RolePerm.Add;
if ((perm & pend) == pend)//true
{
Console.WriteLine("YES,授权范围内");
}
else
{
Console.WriteLine("NO,不在授权范围内 ");
}
Console.Read();
}
}
上述代码以权限作为示例,同理,可以定义一个保存多种状态的枚举变量Status,以相同的方式进行状态验证。不再赘述,请自行尝试。
[2014-12-29]使用Enum位模式进行多重状态(或权限)管理的更多相关文章
- 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16
一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...
- 大型网站演化(转载 http://homeway.me/2014/12/10/think-about-distributed-clusters/)
0x01.大型网站演化 简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率. 集群主要分为:高可用集群(High Availability Clu ...
- [MVC学习日记]2014/12/01 初步认识MVC模型。
2014/12/011.初步认识MVC模型.MVC模式是一种表现模式.它将web应用程序分成三个部分,模型(Model).视图(View).控制器(Controller).Model:是实现业务逻辑层 ...
- 挑战30天写操作系统-day3-进入32位模式并导入C语言
目录 1.制作真正的IPL IPL:启动区,启动程序装载器完整代码: ; haribote-ipl ; TAB=4 CYLS EQU 10 ; 声明CYLS=10 ORG 0x7c00 ; 指明程序装 ...
- [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装
[原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...
- 《30天自制操作系统》笔记(06)——CPU的32位模式
<30天自制操作系统>笔记(06)——CPU的32位模式 进度回顾 上一篇中实现了启用鼠标.键盘的功能.屏幕上会显示出用户按键.点击鼠标的情况.这是通过设置硬件的中断函数实现的,可以说硬件 ...
- IIS32位,64位模式下切换
一.32位模式 1.cscript %systemdrive%\inetpub\adminscripts\adsutil.vbs set w3svc/appPools/enable32bitappon ...
- 2015.12.29~2015.12.30真题回顾!-- HTML5学堂
2015.12.29~2015.12.30真题回顾!-- HTML5学堂 吃饭,能够解决饥饿,提供身体运作机能.练习就像吃饭,强壮自己,提升编程技能,寻求编程技巧的最佳捷径!吃饭不能停,练习同样不能停 ...
- 如何在安装32位Oracle客户端组件的情况下以64位模式运行
C#使用System.Data.OracleClient连接Oracle数据库.之前在WinXP上正常运行的程序移植到Windows 2008 x64上之后就连不上数据库了,错误信息如下:启动data ...
随机推荐
- Android高效内存之让你的图片省内存
Android高效内存之让你的图片省内存 在做内存优化的时候,我们发现除了解决内存泄露问题,剩下的就只有想办法减少真实的内存占用.而在App中,大部分内存可能被我们图片占用了,所以减少图片的内存占用可 ...
- ctf中常见注入题源码及脚本分析
1.代码审计发现 这里没有用escape_string,因此存在注入. function show($username){ global $conn; $sql = "select role ...
- java笔录---反射机制(1)
引言 为了方便记忆java的反射机制,在这里仔细的总结了一下.主要是怕以后忘记了,这样也方便回忆.因为最近利用空余时间深入的了解spring和Mybatis框架, 像spring中核心模块IO ...
- Handler实现线程之间的通信-下载文件动态更新进度条
1. 原理 每一个线程对应一个消息队列MessageQueue,实现线程之间的通信,可通过Handler对象将数据装进Message中,再将消息加入消息队列,而后线程会依次处理消息队列中的消息. 2. ...
- JavaScript中数组的方法总结
js数组元素的添加和删除一直比较迷惑,今天终于找到详细说明的资料了,先给个我测试的代码^-^var arr = new Array();arr[0] = "aaa";arr[1] ...
- oracle函数和存储过程有什么区别
oracle函数和存储过程有什么区别 1. 返回值的区别,函数有1个返回值,而存储过程是通过参数返回的,可以有多个或者没有 2.调用的区别,函数可以在查询语句中直接调用,而存储过程必须单独调用. 函数 ...
- vue-cli安装
近期梳理了一下win和linux下安装vue项目,总结一下,希望对于看的人有帮助,废话不多说. Linux下安装 因为我用的是deepin,所以再此就不演示了.首先电脑上已经安装好了node和npm了 ...
- JS和OC交互的简单应用
先简单地说一下思路吧 需求:在App中嵌入一个webView,已经有了网址,但是需要去掉这个网页中的一些内容 解决方案:取到webView要加载的网址,对这个网址对应的网页信息进行修改 简单描述: 遵 ...
- 关于CNoTrackObject
CNoTrackObject,通过类名称就能大概猜到其意思:避免被跟踪的对象. 使用MFC开发的应用程序,new/delete都被重载,有专用的跟踪机制来检查内存泄漏. 由CNoTrackObject ...
- Java重定向和转发的路径问题
路径问题: ①相对路径和绝对路径: 绝对路径: 绝对路径是以/开头的路径! 相对于当前服务器的绝对路径: 如果是服务器解析,那么/ ...