WebEnh

.net7 mvc jquery bootstrap json 学习中 第一次学PHP,正在研究中。自学进行时... ... 我的博客 https://enhweb.github.io/ 不错的皮肤:darkgreentrip,iMetro_HD
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C#中位枚举(Flags)

Posted on 2023-07-10 17:32  WebEnh  阅读(262)  评论(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); // 所有