C#枚举中的位运算权限分配浅谈

常用的位运算主要有与(&), 或(|)和非(~), 比如:

1 & 0 = 0, 1 | 0 = 1, ~1 = 0

在设计权限时, 我们可以把权限管理操作转换为C#位运算来处理.

第一步, 先建立一个枚举表示所有的权限管理操作:


代码如下:

[Flags]
public enum Permissions
{
Insert = 1,
Delete = 2,
Update = 4,
Query = 8
}

[Flags]表示该枚举可以支持C#位运算, 而枚举的每一项值, 我们用2的n次方来赋值, 这样表示成二进制时刚好是1 = 0001, 2 = 0010, 4 = 0100, 8 = 1000等, 每一位表示一种权限, 1表示有该权限, 0表示没有.

接下来是权限的运算:

1. 权限的加法, 使用与运算来实现. 我们知道, 0001 | 0100 = 0101, 这样就表示同时具有第一位和第三位的权限管理了, 枚举表示为:

Permissions per = Permissions.Insert | Permissions.Update

2. 权限的减法, 使用与运算+非运算来实现, 如上面要去掉Insert权限, 操作为:

Permissions per &= ~Permissions.Insert即是 0101 & ~0001 = 0101 & 1110 = 0100

3. 权限的判断, 使用与运算, 当判断用一用户是否具有该操作权限时, 要把用户的的权限与操作权限进行与运算, 如果得到的结果仍是操作权限管理, 则表示用户具有该权限:

代码如下:

 Permissions per = Permissions.Insert | Permissions.Update;
  if(per & PermissionsPermissions.Insert = Permissions.Insert)
  {
  //有操作权限
  }

比较过程为 0101 & 0001 = 0001, 0001的0位用与C#位运算把其它位都置成0, 变成只比较1的这一位.

(0)

相关推荐

  • 关于c#中枚举类型支持显示中文的扩展说明

    复制代码 代码如下: AuditEnum.cs : public enum AuditEnum{ Holding=0,     Auditing=1, Pass=2, Reject=3      } 以asp.net为例 , 程序中某个方法可能会这样使用枚举值 :public void HandleAudit(int userID, AuditEnum ae){ if (ae==AuditEnum.Pass) { //do something } else if (ae==AuditEnum.R

  • c#入门之枚举和结构体使用详解(控制台接收字符串以相反的方向输出)

    枚举.结构枚举的类型有限(short.byte...)且是相同的,在MSDN上找到枚举的一些示例,觉得这个还不错: 复制代码 代码如下: enum myWeekDay { Monday = 1, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday };int i = 3;myWeekDay today = (myWeekDay)i; 枚举是需要先声明的,然后再通过新建一个变量(today)为枚举类型来使用.枚举默认的基本类型值从0开始,递

  • C#实现获取枚举中元素个数的方法

    本文以一个简单实例讲述了C#实现获取枚举中元素个数的方法,对于C#学习来说是需要加以牢固掌握的技巧.分享给大家供大家参考之用.具体如下: 实现该功能可以使用枚举基类System.Enum的GetNames(Type t) 方法来获取某个枚举中的元素列表. 具体功能代码如下: enum EnumTest { type1, type2, } class Program { static void Main(string[] args) { EnumTest e = new EnumTest(); s

  • C#中可枚举类型详解

    枚举是迭代一个集合中的数据项的过程. 我们经常使用的大多数集合实际上都已经实现了枚举的接口IEnumerable和IEnumerator接口,这样才能使用foreach迭代,有些是含有某种抽象了枚举细节的接口:ArrayList类型有索引,BitArray有Get方法,哈希表和字典有键和值..........其实他们都已经实现了IEnumerable和IEnumerator接口.所以一切的集合和数组都可以用IEnumerable或者IEnumerable<T>接口来定义. IEnumerabl

  • C# 遍历枚举类型的所有元素

    比如定义了一个错误的枚举类型 复制代码 代码如下: public enum eErrorDetailCode : int         {             登陆成功 = 0,             登出 = 1,             应用错误 = 2,             成功 = 16,             失败 = 17         } 需要引用 using System; 然后在循环中,遍历枚举对象的所有元素 复制代码 代码如下: foreach (int  m

  • 深入解析c#中枚举类型的定义与使用

    介绍枚举是一个指定的常数,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举. 定义默认基数从O开始,也可指定数值.enum Days { Saturday=1, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday };enum Colors { Red = 1, Green = 2, Blue = 4, Yellow = 8 }; 使用C

  • 深入理解C#中的枚举

    枚举类型是一种的值类型,它用于声明一组命名的常数. (1)枚举的声明:枚举声明用于声明新的枚举类型.访问修辞符 enum 枚举名:基础类型 复制代码 代码如下: {        枚举成员    } 基础类型必须能够表示该枚举中定义的所有枚举数值.枚举声明可以显式地声明 byte.sbyte.short.ushort.int.uint.long 或 ulong 类型作为对应的基础类型.没有显式地声明基础类型的枚举声明意味着所对应的基础类型是 int. (2)枚举成员枚举成员是该枚举类型的命名常数

  • 理解C#中的枚举(简明易懂)

    一.在学习枚举之前,首先来听听枚举的优点. 1.枚举能够使代码更加清晰,它允许使用描述性的名称表示整数值. 2.枚举使代码更易于维护,有助于确保给变量指定合法的.期望的值. 3.枚举使代码更易输入. 二.枚举说明 1.简单枚举 ●枚举使用enum关键字来声明,与类同级.枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符.枚举本身的修饰符仅能使用public和internal. ●枚举是值类型,隐式继承自System.Enum,不能手动修改.System.Enum本身是引用类型,继承

  • C# 获取枚举值的简单实例

    先申明一个枚举: 复制代码 代码如下: public enum Test_Enum        {            one = 1001, two = 1002, three = 1003, four = 1004, five = 1005, six = 1006, seven = 1007, eight = 1008, nine = 1009, zero = 1000        } 获取值: 复制代码 代码如下: object ojb = Enum.GetName(typeof(T

  • C#枚举数值与名称的转换实例分享

    首先建立一个枚举: 复制代码 代码如下: /// <summary>    /// 颜色    /// </summary>    public enum ColorType    {        /// <summary>        /// 红色         /// </summary>        Red, /// <summary>        /// 蓝色         /// </summary>      

随机推荐