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

简介:

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

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

我们看到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是委托类型的基类

本文转自博客园张占岭(仓储大叔)的博客,原文链接:将不确定变为确定~整形变量是否可以进行位运算(像枚举类型一样),如需转载请自行联系原博主。

目录
相关文章
|
5月前
|
人工智能 自然语言处理 算法
微软AutoGen:多智能体协作的工业级解决方案
作为一名长期关注AI技术发展的开发者,我深深被微软AutoGen框架所展现的多智能体协作能力所震撼。在当今企业数字化转型的浪潮中,单一AI模型已难以满足复杂业务场景的需求,而AutoGen框架的出现为我们提供了一个革命性的解决方案。它不仅突破了传统单体AI的局限性,更通过其独特的多智能体协作机制,实现了真正意义上的"AI团队协作"。经过深入研究和实践,我发现AutoGen在智能体角色定义、通信协议设计、任务协调机制等方面都展现出了工业级的成熟度。特别是其对话驱动的编程范式和灵活的工作流编排能力,为企业级AI应用开发带来了前所未有的便利性和可扩展性。本文将从技术架构、实现原理到企业应用等多个维度
310 1
微软AutoGen:多智能体协作的工业级解决方案
|
11月前
|
人工智能 搜索推荐
AI视频技术的发展是否会影响原创内容的价值
AI视频技术的发展显著降低了视频制作的门槛与成本,自动完成剪辑、特效添加等繁琐工作,大大缩短创作时间。它提供个性化创意建议,帮助创作者突破传统思维,拓展创意边界。此外,AI技术使更多非专业人士也能参与视频创作,注入新活力与多样性,丰富了原创内容。总体而言,AI视频技术不仅提升了创作效率,还促进了视频内容的创新与多样化。
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
弹性计算 数据可视化 Ubuntu
安装 syncthing | 学习笔记
快速学习安装 syncthing,介绍了安装 syncthing 系统机制, 以及在实际应用过程中如何使用。
安装 syncthing | 学习笔记
|
XML 前端开发 Java
Android Kotlin/Java 动态设置 shape/drawable 等状态效果
      小菜最近遇到一个小需求,程序里面有个别页面,需要动态的调整某个页面的样式,包括一键变灰等效果。       以前页面是用 shape 和 drawable 之类实现的效果。
3988 0
|
自然语言处理 JavaScript 前端开发
一文读懂基于 Yaegi 解释器开发可热插拔的 Traefik 插件
Hello folks,我是 Luga,今天我们来聊一下云原生网关 Traefik 堆栈插件及脚本运行载体 ——Yaegi 解释器。
715 0
|
机器学习/深度学习 自然语言处理 算法
【ACL 2023】面向轻量化文图检索的Dual-Encoder模型蒸馏算法ConaCLIP
ConaCLIP针对轻量化的图文检索任务进行设计,是一种通过全连接的知识交互图学习方式将知识从dual-encoder大模型中蒸馏到dual-encoder小模型的算法。
|
JavaScript
vue3显示和隐藏元素?
vue3显示和隐藏元素?
|
缓存 安全 网络协议
【内网安全-防火墙】防火墙、协议、策略
【内网安全-防火墙】防火墙、协议、策略
731 0
【内网安全-防火墙】防火墙、协议、策略
|
消息中间件 存储 监控
4_4_MQTT 协议讲解|学习笔记
快速学习4_4_MQTT 协议讲解。
906 0
4_4_MQTT 协议讲解|学习笔记

热门文章

最新文章