位域(可用于一个人对应多个角色,不需要建关联表)

复制代码
/// <summary>
    /// 参会人角色
    /// </summary>
    [Flags]
    public enum AttendeeRoleEnum
    {
        [Description("所有")]
        All = -1,
        [Description("其他")]
        None = 0,
        [Description("参会人")]
        Registrant = 1,
        [Description("演讲嘉宾")]
        Speaker = 2,
        [Description("随行人员")]
        Guest = 4,
        [Description("作者")]
        Author = 8,
        [Description("普通观众")]
        Purchaser = 16,
        [Description("工作人员")]
        Personnel = 32,
        [Description("评审专家")]
        EssayExpert = 64,

    }
复制代码

注意:枚举上要加上[Flags]

如果一个人参会人:数据库的值是1,如果是参会人又是评审专家,那值就等于65...

 

数据库值:

/// <summary>
        /// 参会人角色(这里存的是flags值,查询要用 & 查询)
        /// </summary>
        public int AttendeeRole { get; private set; }

 

 

赋值:

复制代码
/// <summary>
        /// 设置角色 (这里需要在之前的位域前增加角色,不能直接赋值)
        /// </summary>
        /// <param name="role"></param>
        public void SetAttendeeRole(AttendeeRoleEnum role)
        {
            AttendeeRoleEnum flags = (AttendeeRoleEnum)AttendeeRole;
            AttendeeRole = (int)(flags | role);
        }
复制代码

 

移除相应的枚举值:

复制代码
/// <summary>
        /// 清除相关角色 (这里需要在之前的位域前增加角色,先移除,不能直接赋值)
        /// </summary>
        /// <param name="role"></param>
        public void ClearAttendeeRole(List<AttendeeRoleEnum> roleEnums)
        {
            var roleFlags = (AttendeeRoleEnum)AttendeeRole;

            foreach (var item in roleEnums)
            {
                if (roleFlags.HasFlag(item))
                {
                    roleFlags = roleFlags ^ item;
                }
            }

            AttendeeRole = (int)roleFlags;
        }
复制代码

 

 

将值转化为集合:

复制代码
/// <summary>
        /// 该参会人拥有的角色
        /// </summary>
        public List<AttendeeRoleEnum> AttendeeRoles
        {
            get
            {
                List<AttendeeRoleEnum> roles = new List<AttendeeRoleEnum>();
                var roleFlags = (AttendeeRoleEnum)AttendeeRole;// 比如数据库里的AttendeeRole = 65 ,那么这样得到的值是 Registrant|EssayExpert

                if (roleFlags.HasFlag(AttendeeRoleEnum.Registrant))
                {
                    roles.Add(AttendeeRoleEnum.Registrant);
                }
                if (roleFlags.HasFlag(AttendeeRoleEnum.Speaker))
                {
                    roles.Add(AttendeeRoleEnum.Speaker);
                }
                if (roleFlags.HasFlag(AttendeeRoleEnum.Guest))
                {
                    roles.Add(AttendeeRoleEnum.Guest);
                }
                if (roleFlags.HasFlag(AttendeeRoleEnum.Author))
                {
                    roles.Add(AttendeeRoleEnum.Author);
                }
                if (roleFlags.HasFlag(AttendeeRoleEnum.Purchaser))
                {
                    roles.Add(AttendeeRoleEnum.Purchaser);
                }
                if (roleFlags.HasFlag(AttendeeRoleEnum.Personnel))
                {
                    roles.Add(AttendeeRoleEnum.Personnel);
                }
                if (roleFlags.HasFlag(AttendeeRoleEnum.EssayExpert))
                {
                    roles.Add(AttendeeRoleEnum.EssayExpert);
                }
                return roles;
            }
        }
复制代码

 

mysql中查询:

SELECT    id,attendee_role FROM    attendee WHERE attendee_role&64;

注意:枚举对应的值,放在&后面即可

posted @   月下之神  阅读(280)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示