WebEnh

.net7 mvc jquery bootstrap json 学习中 第一次学PHP,正在研究中。自学进行时... ... 我的博客 https://enhweb.github.io/ 不错的皮肤:darkgreentrip,iMetro_HD
随笔 - 1079, 文章 - 1, 评论 - 75, 阅读 - 174万
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

C#中位枚举(Flags)

Posted on   WebEnh  阅读(414)  评论(0编辑  收藏  举报

在日常的开发工作当中,位枚举可能会被经常使用,如星期多选、租期多选等等,我们可以将多选字段做或运算,然后保存到数据库表的字段中,如 1 | 2 = 3(0001 | 0010 = 0011 = 3)。

一、定义位枚举(Flags)

只需要在枚举上添加FlagsAttribute特性

[Flags]
        public enum C
        {
            [Description("a")]
            a = 1 << 0,
            [Description("b")]
            b = 1 << 1,
            [Description("c")]
            c = 1 << 2,
            [Description("所有")]
            d = -1
        }

注意事项:定义位枚举时,一定要保证值的二进制之间值做&运算为0,如 2的n次方。
为什么使用-1代表所有:1的二进制就是1的补码,相当于在n位中的二进制就是n个1组成。

2、位枚举的方法

在Nuget引入包Enums.Net或者在程序包管理控制台中输入Install-Package Enums.NET -Version 4.0.0。

常用方法:
1、HasFlag

        //与HasAllFlags一样的
        var c = C.a | C.b;
        var h = C.c | C.a;
        // var result = source.HasFlas(Targe)
        // 如果source | Targe = Source 或者 Source & Targe = Targe
        //则为true 否则为False,可以理解成Targe是Source的真子集
        var b = c.HasFlag(c); // true
        var d = c.HasFlag(C.a); // true
        var e = c.HasFlag(C.c); // false
        var f = c.HasFlas(h); // false

2、HasAnyFlags


        var c = C.a | C.b;
        var h = C.d | C.a;

        //  var result = source.HasFlas(Targe)
        // source & targe != 0 则为true 否则为false
        // 可以理解成source与targe不存在交集
        //在开发当中,需要判断两条数据中字段是否存在冲突时

        var e = c.HasAnyFlags(h); // true
        var f = C.d.HasAnyFlags(c); // true;
        

3、FlagEnums.CombineFlags


        var s = new List<C> { C.a, C.b, C.c};

        // s中的元素做或(|)运算
        var h = FlagEnums.CombineFlags(s);
        var b = (int)h == 7; // true
        

4、FlagEnums.GetAllFlags
获取枚举中的全部枚举值,除-1外

   var h = FlagEnums.GetAllFlags<C>(); // a | b | c

5、GetFlags

    var h = FlagEnums.GetAllFlags<C>();
    var h1 = h.GetFlags().ToList(); // 拆分 a | b | c

6、AsString(EnumFormat.Description)

    // 获取描述
    var h = C.d.AsString(EnumFormat.Description); // 所有
 
 
 
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2020-07-10 跨域问题服务端解决办法 Request header field Authorization is not allowed by Access-Control-Allow-Headers
2018-07-10 .net OADate 转javascript的Datetime js 5位 日期 转换
2017-07-10 (转载)开发人员必须用到的开发软件破解
2017-07-10 HTML5漫谈(7)——如何保护HTML5应用代码
2017-07-10 【转】使用Jasob混淆javascript代码
2016-07-10 SQL 查询数据库中所有表信息
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

了解更多