标志枚举(Flag Enum)

在 C# 中,使用 Flags 属性声明的枚举被称为标志枚举(Flag Enum)。标志枚举允许将多个枚举值组合成一个单独的值,以便同时表示多个状态或选项。

当你使用标志枚举时,可以通过按位运算来组合、拆分和检查枚举值。这使得标志枚举在表示各种组合状态的选项时非常有用。

 [Flags]
 public enum EnumCustomFunction : long
 {
     多涂层 = 1 << 0,
     导入检测数据 = 1 << 1,
     导入ABCard数据 = 1 << 2,
     导出报告自适应列宽 = 1 << 3,
     新项目管理 = 1 << 4,
 }

 

EnumCustomFunction 是一个标志枚举,其中每个枚举值都是通过左移位运算符 << 来定义的。例如,多涂层 的值是 1 左移 0 位,即 1,导入检测数据 的值是 1 左移 1 位,即 2,以此类推。

以下是一些标志枚举的常见用法:

  1. 组合枚举值:

     
    EnumCustomFunction options = EnumCustomFunction.导入检测数据 | EnumCustomFunction.导入ABCard数据;

     

  2. 拆分枚举值:

     
    if ((options & EnumCustomFunction.导入检测数据) == EnumCustomFunction.导入检测数据)
    {
        // 包含导入检测数据选项
    }
     if (customerforminfo != null && customerforminfo.ConfigSummary != null && ((EnumCustomFunction)customerforminfo.ConfigSummary & EnumCustomFunction.新项目管理) == EnumCustomFunction.新项目管理)
     {
         isaddproject = 1;
     }

     

  3. 添加或移除枚举值:

    csharpCopy Code
    options = options | EnumCustomFunction.新项目管理; // 添加新项目管理选项
    options = options & ~EnumCustomFunction.多涂层; // 移除多涂层选项

     

  4. List<int> configfuncValues = new List<int>();
    if (model != null && model.ConfigFunc > 0) 
    {
        foreach (EnumConfigFunc value in Enum.GetValues(typeof(EnumConfigFunc)))
        {
            if (((EnumConfigFunc)model.ConfigFunc & value) == value)
            {
                configfuncValues.Add((int)value);
            }
        }
    }
    
     [Flags]
     public enum EnumConfigFunc
     {
         /// <summary>
         /// 存心节
         /// </summary>
         [Description("存心节")]
         ScriptureSetting = 1 << 0,
         /// <summary>
         /// 邮箱设置
         /// </summary>
         [Description("邮箱设置")]
         EmailSetting=1 << 1,
         /// <summary>
         /// 微信公众号设置
         /// </summary>
         [Description("微信公众号设置")]
         WechatAppSetting=1 << 2,
         /// <summary>
         ///点赞评论菜单设置
         /// </summary>
         [Description("点赞评论菜单设置")]
         AllowCommentsMenusSetting=1 << 3
     }
    
     <el-tab-pane label="存心节" name="scripturetab" v-if="model.ConfigfuncValues && model.ConfigfuncValues.length > 0 && model.ConfigfuncValues.includes(1)">
    
    //获取各各色站点配置选项合辑
    var configFuncs = roles.Where(x => x.ConfigFunc.HasValue && x.ConfigFunc.Value > 0)
       .Select(x => x.ConfigFunc.Value)
       .ToList();
    
    if (configFuncs != null && configFuncs.Any())
    {
        var configfuncValues = configFuncs.SelectMany(configFunc =>
                               Enum.GetValues(typeof(EnumConfigFunc))
                                   .Cast<EnumConfigFunc>()
                                   .Where(value => ((EnumConfigFunc)configFunc & value) == value)
                                   .Select(value => (int)value)
                               )
                               .Distinct()
                               .ToList();
        result.Data.ConfigfuncValues = configfuncValues;
    }

     

 

posted @ 2024-02-19 17:46  BloggerSb  阅读(162)  评论(0编辑  收藏  举报