回到目录

如果您看到这个题目,觉得有点怪,那说明你是一个高人,最起码比我高的多,呵呵。

前几天做了一个公用后台管理系统的项目,其中有一个地方涉及到权限管理的,即为每一个按钮赋一个权限,然后它权限汇总到角色表里,即一种角色有一些操作权限
,表结构如下:

我们看到OperatorAuthority就是操作权限的意思,它是个int类型的,一个role有一个OperatorAuthority,那我们应该怎么把多个权限存储到OperatorAuthority字段里呢?

这时,我想到了枚举类型的位运算,所以我把权限枚举设计成了这样:

 1   [Flags]
 2     public enum UserOperatorRole
 3     {
 4         #region 通用操作权限
 5
 6         /// <summary>
 7         /// 没有任何操作权限
 8         /// </summary>
 9         [Description("没有权限")]
10         NoneAny = 1,
11         /// <summary>
12         /// 查看事件
13         /// </summary>
14         [Description("查看事件")]
15         ReadEvent = 2,
16         /// <summary>
17         /// 添加事件
18         /// </summary>
19         [Description("添加事件")]
20         AddEvent = 4,
21         /// <summary>
22         /// 修改事件
23         /// </summary>
24         [Description("修改事件")]
25         ModifyEvent = 8,
26         /// <summary>
27         /// 删除事件
28         /// </summary>
29         [Description("删除事件")]
30         DeleteEvent = 16,
31         /// <summary>
32         ///  审批
33         /// </summary>
34         [Description("审批")]
35         ApproveEvent = 32
36
37         #endregion
38
39
40
41
42     }

然后在存储时,使用枚举的位运算,对它进行求和即可,如查看事和修改事件的结果被存储为10,即它只能是2和8相加的结果,如果希望了解更多位运算,可以查看我的这篇文章

这样的设计,对于单个项目是没有任何问题的,如果希望添加一种新的功能,如“订阅”,我们只要修改这个枚举类,再为它添加一种订阅的逻辑即可。(当然,这不符合开闭原则了)

但我设计的偏偏是一个“通用的系统”,即可能会有多个不同的项目去引用这个系统,这个系统相当于一个底层的核心系统,这时问题就来了,系统A的权限需要添加一个“撤单”权限,而系统B需要有一个“发布产品”及“管理产品”的权限,这下子我也完蛋了,这种需求被不断的添加进来,我可怎么办呀!

主角登场了,整形也来个们运算吧,首先我把所有公用权限进行统计,放在一张表里,如果其它系统有新需求,在它的权限表里继续添加即可,表结构如下:

这样的设计,我认为完成了,但对于一个int32类型来说,它是否也可以支持按位计算呢?我又一想,枚举类型本来就是继承int,short,long,byte等整形类型的,所以,我认识int32也完全可以支持位运算,结果我的测试表明我的想法是正确的,呵呵。

这时,我们通用按钮的建立,就变成了这样,接收一个Enum这个枚举类型的统一基类,这样不管A系统和B系统自定义什么样的枚举,我都通通接受,呵呵。

 1  /// <summary>
 2         /// 按钮对象,只产生按钮,对按钮的click等事件需要在具体页面自己添加
 3         /// </summary>
 4         /// <param name="html"></param>
 5         /// <param name="buttonName">按钮ID</param>
 6         /// <param name="displayName">按钮显示名称</param>
 7         /// <param name="userOperatorRole">按钮权限</param>
 8         /// <param name="buttonType">按钮类型</param>
 9         /// <returns></returns>
10         public static MvcHtmlString CreateButton(this HtmlHelper html, string buttonName, string displayName, Enum userOperatorRole, ButtonType buttonType)
11         {
12             var tag = new TagBuilder("input");
13             tag.AddCssClass("button");
14             tag.Attributes["Name"] = buttonName;
15             tag.Attributes["ID"] = buttonName;
16             tag.Attributes["Value"] = displayName;
17             tag.Attributes["Type"] = buttonType.ToString();
18             if ((Convert.ToInt32(SessionAction.ReadSession("UserOperatorRole")) & Convert.ToInt32(userOperatorRole)) == 0)
19             {
20                 tag.Attributes["disabled"] = "disabled";
21                 tag.AddCssClass("button gray");
22             }
23             return MvcHtmlString.Create(tag.ToString());
24         }

程序员在开发时,枚举类型起到了直观,准确和可读性强的优点,所以,对于一些固定的少限的元素集可以采用枚举类型和存储。

小知识:Enum是枚举类型的基类

Delegate是委托类型的基类

回到目录

转载于:https://www.cnblogs.com/lori/archive/2012/06/08/2541399.html

将不确定变为确定~整形变量是否可以进行位运算(像枚举类型一样)相关推荐

  1. 实现2个整形变量的交换

    实现2个整形变量的交换 int a = 10;int b = 20;System.out.println("a:"+a+",b:"+b);//方法1:使用第三方 ...

  2. C语言面试题--已知整形变量在内存中占4个字节的空间,现有一无符号整形变量a = 0x20190125,请编写函数求出变量a所占内存每个字节的值是多少?

    已知整形变量在内存中占4个字节的空间,现有一无符号整形变量a = 0x20190125,请编写函数求出变量a所占内存每个字节的值是多少? 用共用体方法:共用体内的空间是公用的,每一个成员都可以访问共用 ...

  3. C语言基础(整形变量,实型数据)

    整型变量的分类:(字节与系统和编译器有关) 1.基本型:类型说明符为 int,在内存中占4个字节; 2.短整型:类型说明符为 short int或 int: 3.长整型:类型说明符为 long int ...

  4. 输入a,b,c三个整数,按由大到小顺序输出。(用3个指针变量指向3个整形变量,然后用swap函数来实现互换3个整型变量的值)

    /* * Copyright (c) 2012, 烟台大学计算机学院 * All rights reserved. * 作 者: 刘同宾 * 完成日期:2012 年 11 月 29 日 * 版 本 号 ...

  5. 把下列c语言的语句改写成汇编语言的程序片段,其中变量都为整形变量,汇编程序设计读书笔记(4)...

    第1章 标识符和表达式 1.1 标识符 标识符最多由31个字母.数字及规定的特殊字符(?.@._.$)等组成,但它不能用数字开头.通常情况下,汇编语言不区分标识符中字母的大小写. 1.2 简单内存变量 ...

  6. c语言中整形变量,C语言基本数据类型:整型(int)用法详解

    1.整型int C语言提供了很多整数类型(整型),这些整型的区别在于它们的取值范围的大小,以及是否可以为负.int是整型之一,一般被称为整型.以后,在不产生歧义的情况下,我们把整数类型和int都称为整 ...

  7. Python_Task01:变量、运算符、数据类型及位运算

    变量.运算符.数据类型及位运算 学习教程 变量.运算符.数据类型 1. 注释 2. 运算符 3. 变量和赋值 4. 数据类型与转换 5. print() 函数 思考题 练习题 位运算 1.原码.反码和 ...

  8. c语言中按位或赋值给变量,[转载]C语言位运算符在单片机上的应用

    C语言位运算符 学过汇编的朋友都知道汇编对位的处理能力是很强的,但是C语言也能对运算对象进行按位操作,从而使C语言也能具有一定的对 硬件直接进行操作的能力.位运算符的作用是按位对变量进行运算,但是并不 ...

  9. 【转】C#中枚举类型与静态变量

    C#中enum类型,相较于其他基本数据类型来说比较特殊,他的本质上是一堆整数组成的结构体,并且支持与整型的显式转化. 既然是枚举类型,那么也就是说enum中的变量是不可以轻易改变的,所以C#将枚举类型 ...

最新文章

  1. 两个有序单链表的并交差运算
  2. 优化SQl的30中常用方法
  3. java 图像处理 空白_使用Java进行图像处理的一些基础操作
  4. 你的网页加载太慢了怎么办?
  5. Leetcode每日一题:136.single-number(只出现一次的数字)
  6. 一波黑科技即将袭来!StarVR带你感受他们的未来
  7. 纯粹经济学 —— 基本概念
  8. 任务调度、磁盘、进程管理、PRM和YUM
  9. 计算机的超级终端程序无法使用,超级终端怎么用?
  10. 奥的斯服务器故障查询及使用
  11. minus oracle 顺序_Minus 在oracle 中的用法
  12. 华为5G产品大配套,火星人光电互联大科普
  13. Linux 下软件包的安装,压缩,解压(详细)
  14. OpenCV--011:像素归一化
  15. IT桔子分布式项目2
  16. 完全背包与01背包的区别
  17. ExecutorCompletionService
  18. 【C++】常用math函数
  19. 计算机体系架构(1)计算机组成原理
  20. ZooKeeper的节点类型有哪些?

热门文章

  1. 使用ORM数据库:greenDao
  2. 2020-12-01 Halcon初学者知识[1] 初始界面
  3. 银行java多线程例子_Java 多线程 之 银行ATM实例
  4. python批量读取tiff文件_Python图像分析:从共焦显微镜读取多维TIFF文件
  5. 判断一个变量类型是数组还是对象
  6. 剑指Offer——Java答案
  7. 并发编程(四):也谈谈数据库的锁机制
  8. 海明嵌入Hamming Embedding生成Binary Signature之matlab程序代码
  9. 如何高效的阅读Hadoop源代码?Hadoop的源代码写的怎么样?
  10. 一些重要的算法The Most Important Algorithms