在日常的开发工作当中,位枚举可能会被经常使用,如星期多选、租期多选等等,我们可以将多选字段做或运算,然后保存到数据库表的字段中,如 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); // 所有
转自:http://Www.CnBlogs.Com/WebEnh/
如果想下次快速找到我,记得点下面的关注哦!
本博客Android APP 下载 |
![]() |
支持我们就给我们点打赏 |
![]() |
支付宝打赏 支付宝扫一扫二维码 |
![]() |
微信打赏 微信扫一扫二维码 |
![]() |
如果想下次快速找到我,记得点下面的关注哦!