ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Enum中的Flags特性

2022-07-18 16:34:35  阅读:240  来源: 互联网

标签:Enum RenewalNoticeSend 过期 某项 特性 发送 Flags 移除 URNRenewal


 1、一般的枚举,如:

Public enum OrderStatus
{
    Pending=0,
    Open=1,
    Complete=2
}

在某一时刻OrderStatus只能是这些枚举中的任意一个值。

2、如果我们想要这个枚举的复合值呢?

即枚举在某一个时刻既有A值又有B值,这时枚举就需要Flags标志

FlagsAttribute 类

指示可将枚举视为位域(即一组标志)。

C# Flags Enum语法:

添加某项用"|" 移除某项用"~" 判断是否存在某项用HasFlag或"&"

SqlServer Flags Enum语法:

添加某项用"|":
SELECT 0|1|2   --3
移除某项用"^"
SELECT 0|1|2^2  --1
判断是否存在某项用"&":
SELECT 0|1|2&2  --2

下面在LinqPad中创建一个Demo,创建一个URNRenewal枚举

用户示例:

场景1:URN 30天内即将过期发送邮件给客户A,发送后设置标志位RenewalNoticeSend 场景2:客户A收到30天内URN过期提醒,重置了过期时间需要设置标志位ExpirationDateChange,移除标志位RenewalNoticeSend、ExpiredNoticeSend 场景3:客户A重置了过期时间需要发送邮件给客户B,发送后设置标志位ExtensionNoticeSend 场景4:URN已过过期时间需要发送邮件给客户C,发送后设置标志位ExpiredNoticeSend 实际场景1: 系统发送了30天内即将过期的邮件给客户A,客户A什么也没有做。30天过后系统又发送了URN过期邮件给客户C。这时标志位既包含RenewalNoticeSend又包含ExpiredNoticeSend
[Flags]
public enum URNRenewal
{
        /// <summary>
        /// 初始值
        /// </summary>
        NONE = 0,
        /// <summary>
        /// 30天提醒已发
        /// </summary>
        RenewalNoticeSend = 1,
        /// <summary>
        /// 发送提醒后已修改ExpirationDate
        /// </summary>
        ExpirationDateChange = 2,
        /// <summary>
        /// 修改ExpirationDate后提醒邮件已发
        /// </summary>
        ExtensionNoticeSend = 4,
        /// <summary>
        /// URN Expired Notice Email已发
        /// </summary>
        ExpiredNoticeSend = 8
}

void Main() {     //Uniform Registration Number     var URNFlag = URNRenewal.NONE;       //实际场景1:系统发送了30天内即将过期的邮件给客户A,客户A什么也没有做。30天过后系统又发送了URN过期邮件     给客户C。这时标志位状态是RenewalNoticeSend|ExpiredNoticeSend=9     //Flag Enum添加某项用"|"     //Flag Enum移除某项用"~"     //Flag Enum判断是否存在某项用HasFlag或"&"     URNFlag = URNRenewal.RenewalNoticeSend | URNRenewal.ExpiredNoticeSend;       // See if RenewalNoticeSend flag is set.     if(URNFlag.HasFlag(URNRenewal.RenewalNoticeSend))     {         "RenewalNoticeSend Flag Include".Dump();     }     // See if RenewalNoticeSend flag is set.     if((URNFlag & URNRenewal.RenewalNoticeSend)== URNRenewal.RenewalNoticeSend)     {         "RenewalNoticeSend Flag Include".Dump();     }     //如果想要移除某个Flag,例如移除ExpiredNoticeSend     URNFlag &= ~URNRenewal.RenewalNoticeSend;     // See if RenewalNoticeSend flag is set.     if(!URNFlag.HasFlag(URNRenewal.RenewalNoticeSend))     {         "RenewalNoticeSend Flag Removed".Dump();     }     //数据库中关于Enum Value的位运算与C#相同如     //SqlServer     //添加某项用"|":SELECT 0|1|2   =3     //移除某项用"^"SELECT 0|1|2^2  =1     //判断是否存在某项用"&":SELECT 0|1|2&2   =2

}

参考:

FlagsAttribute 类 (System) | Microsoft Docs

标签:Enum,RenewalNoticeSend,过期,某项,特性,发送,Flags,移除,URNRenewal
来源: https://www.cnblogs.com/wzyandi/p/16490867.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有