基本權限設計:

/// <summary>
/// 權限列舉
/// </summary>
[FlagsAttribute]
public enum Permissions
{
    [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 運算)

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

技巧三:加入【FlagsAttribute】標籤

Permissions permission = 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 運算應用)

Permissions permission = 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 運算)

Permissions permission = 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
 
bool IsCreatable = false;
if((permission & Permissions.Create) == Permissions.Create)
{
    IsCreatable = true;
}
else
{
    IsCreatable = false;
}
MessageBox.Show(IsCreatable.ToString());
// Result: True

簡易權限類別設計:

   1:  /// <summary>
   2:  /// 我的權限
   3:  /// </summary>
   4:  public class MyPermission
   5:  {
   6:      private Permissions _permission;
   7:      private bool _isCreatable = false;
   8:      private bool _isReadable = false;
   9:      private bool _isUpdatable = false;
  10:      private bool _isDeletable = false;
  11:   
  12:      /// <summary>
  13:      /// 權限
  14:      /// </summary>
  15:      public Permissions Permission
  16:      {
  17:          get { return _permission; }
  18:          set
  19:          {
  20:              _permission = value;
  21:   
  22:              IsCreatable = ((value & Permissions.Create) == Permissions.Create) ? true : false;
  23:              IsReadable = ((value & Permissions.Read) == Permissions.Read) ? true : false;
  24:              IsUpdatable = ((value & Permissions.Update) == Permissions.Update) ? true : false;
  25:              IsDeletable = ((value & Permissions.Delete) == Permissions.Delete) ? true : false;
  26:          }
  27:      }
  28:   
  29:      /// <summary>
  30:      /// 是否可建立?
  31:      /// </summary>
  32:      public bool IsCreatable
  33:      {
  34:          get { return _isCreatable; }
  35:          set
  36:          {
  37:              _isCreatable = value;
  38:   
  39:              if (value)
  40:              {
  41:                  AddPermissionFlag(Permissions.Create);
  42:              }
  43:              else
  44:              {
  45:                  RemovePermissionFlag(Permissions.Create);
  46:              }
  47:          }
  48:      }
  49:   
  50:      /// <summary>
  51:      /// 是否可讀?
  52:      /// </summary>
  53:      public bool IsReadable
  54:      {
  55:          get { return _isReadable; }
  56:          set 
  57:          {
  58:              _isReadable = value;
  59:   
  60:              if (value)
  61:              {
  62:                  AddPermissionFlag(Permissions.Read);
  63:              }
  64:              else
  65:              {
  66:                  RemovePermissionFlag(Permissions.Read);
  67:              }
  68:          }
  69:      }
  70:   
  71:      /// <summary>
  72:      /// 是否可新增?
  73:      /// </summary>
  74:      public bool IsUpdatable
  75:      {
  76:          get { return _isUpdatable; }
  77:          set
  78:          {
  79:              _isUpdatable = value;
  80:   
  81:              if (value)
  82:              {
  83:                  AddPermissionFlag(Permissions.Update);
  84:              }
  85:              else
  86:              {
  87:                  RemovePermissionFlag(Permissions.Update);
  88:              }
  89:          }
  90:      }
  91:   
  92:      /// <summary>
  93:      /// 是否可刪除?
  94:      /// </summary>
  95:      public bool IsDeletable
  96:      {
  97:          get { return _isDeletable; }
  98:          set
  99:          {
 100:              _isDeletable = value;
 101:   
 102:              if (value)
 103:              {
 104:                  AddPermissionFlag(Permissions.Delete);
 105:              }
 106:              else
 107:              {
 108:                  RemovePermissionFlag(Permissions.Delete);
 109:              }
 110:          }
 111:      }
 112:   
 113:      /// <summary>
 114:      /// 現有權限中增加某個權限
 115:      /// </summary>
 116:      /// <param name="addFlag">某個權限</param>
 117:      public void AddPermissionFlag (Permissions addFlag)
 118:      {
 119:          _permission = _permission | addFlag;
 120:      }
 121:   
 122:      /// <summary>
 123:      /// 現有權限中移除某個權限
 124:      /// </summary>
 125:      /// <param name="removeFlag">某權限</param>
 126:      public void RemovePermissionFlag (Permissions removeFlag)
 127:      {
 128:          _permission = (_permission & (Permissions.All ^ removeFlag));    
 129:      }
 130:  }

簡易權限類別使用:

   1:  MyPermission mp = new MyPermission();
   2:   
   3:  mp.Permission = Permissions.Create;
   4:  // Create
   5:  MessageBox.Show(mp.Permission.ToString());
   6:   
   7:  mp.AddPermissionFlag(Permissions.Read);
   8:  // Create, Read
   9:  MessageBox.Show(mp.Permission.ToString());
  10:   
  11:  mp.IsUpdatable = true;
  12:  // Create, Read, Update
  13:  MessageBox.Show(mp.Permission.ToString());
  14:   
  15:  mp.IsDeletable = true;
  16:  // All
  17:  MessageBox.Show(mp.Permission.ToString());
  18:   
  19:  mp.RemovePermissionFlag(Permissions.Delete);
  20:  // Create, Read, Update
  21:  MessageBox.Show(mp.Permission.ToString());
  22:   
  23:  mp.IsUpdatable = false;
  24:  // Create, Read
  25:  MessageBox.Show(mp.Permission.ToString());
 

from:http://www.dotblogs.com.tw/chhuang/archive/2008/04/26/3514.aspx

C# Enum 简易权限设计 使用FlagsAttribute属性的更多相关文章

  1. C# 枚举 Flag属性(权限设计)

    枚举是一个可以列举元素的对象,常用于权限,日期,类型等. 如果对一个值可以包含多个,那么可以使用枚举,加上Flags [Flag] public enum Permission { create=, ...

  2. Angularjs,WebAPI 搭建一个简易权限管理系统

    Angularjs,WebAPI 搭建一个简易权限管理系统 Angularjs名词与概念(一)   1. 目录 前言 Angularjs名词与概念 权限系统原型 权限系统业务 数据库设计和实现 Web ...

  3. AppBox升级进行时 - 扁平化的权限设计

    AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. AppBox v2.0中的权限实现 AppBox v2.0中权限管理中涉及三个 ...

  4. [后端人员耍前端系列]AngularJs篇:使用AngularJs打造一个简易权限系统

    一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJS来打造一个简易的权限管理系统.下面不多 ...

  5. AngularJs打造一个简易权限系统

    AngularJs打造一个简易权限系统 一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJ ...

  6. JAVA 数据权限设计

    数据权限设计 前言 在各种系统中.要保证数据对象的安全性以及易操作性,使企业的各业务部门.职能部门可以方便并且高效的协同工作,那么一个好的数据权限管理设计就成为一个关键的问题.尽管企业中各个单元的工作 ...

  7. 数据权限设计——基于EntityFramework的数据权限设计方案:一种设计思路

    前言:“我们有一个订单列表,希望能够根据当前登陆的不同用户看到不同类型的订单数据”.“我们希望不同的用户能看到不同时间段的扫描报表数据”.“我们系统需要不同用户查看不同的生产报表列”.诸如此类,最近经 ...

  8. ASP.NET -- WebForm -- Cookie的使用 应用程序权限设计 权限设计文章汇总 asp.net后台管理系统-登陆模块-是否自动登陆 C# 读写文件摘要

    ASP.NET -- WebForm -- Cookie的使用 ASP.NET -- WebForm --  Cookie的使用 Cookie是存在浏览器内存或磁盘上. 1. Test3.aspx文件 ...

  9. Java工作流引擎-集团模式下的权限 设计与实现

    关键字 工作流开发框架权限设计.用户组.岗位.集团模式应用. java工作流程引擎, .net 工作流引擎,工作流开发框架 相关的表结构 -- 相关组织-表结构. SELECT No,Name,Par ...

随机推荐

  1. Leetcode: 4Sum II

    Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such t ...

  2. 夺命雷公狗-----React---4--props变量的传递

    提示:props的值是不可以改变的... <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  3. busybox-1.12.2编译提示“混合的隐含和普通规则”错误解决

    编译环境:CentOs 7.1 Ubuntu 12.0.4 都可以 交叉编译工具:gcc -4.3.2 (博创6410平台) 问题描述:执行make menuconfig命令的时候,提示Makefil ...

  4. z/OS上Dataset 的移动

    最近的一个需求,需要把大批量的Dataset移到新的Storage Class,新的Volume中去,刚开始感觉非常头疼.仔细研究后发现这个事情其实很简单.确实符合别人所说,事情的在你真正开始努力之后 ...

  5. mysql常用命令(2)

    1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root ...

  6. App创业者必看:如何选择免费数据分析平台

      笔者是一位移动互联网老兵,做过好几个App的开发运营工作,其中一些如今侥幸有了上亿用户.今天和大家聊一下App开发中,不能缺少的一个工具——数据分析系统 首先,App创业者为什么需要一个数据分析系 ...

  7. [JavaScript]JavaScript处理iframe的动作

    随着W3C一声令下,几年前使用非常频繁的frameset + frame已完成使命,光荣退伍.作为frameset的替代方案(姑且这么称吧),iframe的使用也多了起来.较frameset方案,if ...

  8. android sdcard信息获取

    手机存储都有两种,一种是 手机自带的存储,称为internal storage,另外一种用户额外插入的存储,称为removable storage (也就是外置sdcard的部分). removabl ...

  9. 【宽度优先搜索】神奇的状态压缩 CodeVs1004四子连棋

    一.写在前面 其实这是一道大水题,而且还出在了数据最水的OJ上,所以实际上这题并没有什么难度.博主写这篇blog主要是想写下一个想法--状态压缩.状态压缩在记录.修改状态以及判重去重等方面有着极高的( ...

  10. Codeforces Round #356 (Div. 2)

    A. Bear and Five Cards time limit per test 2 seconds memory limit per test 256 megabytes input stand ...