You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在继承Enumeration的类中使用flags属性及实现带限制的多选

嗨,我来一步步帮你搞定这两个关于枚举(Enumeration)的问题,结合你提到的排班场景,直接上实用的方案和代码示例!

1. 在继承Enumeration的类中使用flags属性

这里默认我们说的是C#里的Enum类型(这是最常用带flags特性的枚举实现)。要让枚举支持多选项组合,核心就是给枚举类加上[Flags]特性,同时把每个枚举成员的数值设为2的幂次(比如1、2、4、8...),这样每个成员对应二进制里的一个独立位,组合起来不会互相干扰。

举个基础例子:

[Flags]
public enum ScheduleType
{
    None = 0,
    Fixed = 1 << 0,  // 对应数值1
    Rotated = 1 << 1, // 对应数值2
    FullTime = 1 << 2, // 对应数值4
    PartTime = 1 << 3, // 对应数值8
    Flexible = 1 << 4  // 对应数值16
}

这样你就可以直接用按位或(|)来组合选项,用按位与(&)来检查是否包含某个选项:

// 组合Fixed + FullTime + Flexible三种排班类型
var selectedSchedules = ScheduleType.Fixed | ScheduleType.FullTime | ScheduleType.Flexible;

// 检查选中的组合里是否包含Fixed
if ((selectedSchedules & ScheduleType.Fixed) != ScheduleType.None)
{
    Console.WriteLine("当前选中的排班包含Fixed类型");
}
2. 实现带互斥限制的多选

根据你的需求:Fixed与Rotated互斥,FullTime与PartTime互斥,我们可以在验证选中选项的环节加入规则检查,这里提供两种实用方案:

方案一:在业务逻辑层做验证

写一个专门的验证方法,判断选中的枚举组合是否违反互斥规则:

public static bool IsValidScheduleCombination(ScheduleType selected)
{
    // 检查Fixed和Rotated是否同时被选中
    bool hasFixedAndRotated = (selected & ScheduleType.Fixed) != ScheduleType.None 
                             && (selected & ScheduleType.Rotated) != ScheduleType.None;
    
    // 检查FullTime和PartTime是否同时被选中
    bool hasFullAndPart = (selected & ScheduleType.FullTime) != ScheduleType.None 
                         && (selected & ScheduleType.PartTime) != ScheduleType.None;
    
    return !hasFixedAndRotated && !hasFullAndPart;
}

使用的时候直接调用即可:

// 非法组合:同时选了Fixed和Rotated
var invalidSelection = ScheduleType.Fixed | ScheduleType.Rotated;
if (!IsValidScheduleCombination(invalidSelection))
{
    Console.WriteLine("错误:Fixed和Rotated不能同时选择!");
}

// 合法组合:Fixed + FullTime + Flexible
var validSelection = ScheduleType.Fixed | ScheduleType.FullTime | ScheduleType.Flexible;
if (IsValidScheduleCombination(validSelection))
{
    Console.WriteLine("当前排班组合合法!");
}

方案二:封装到自定义枚举类(如果用的是自定义Enumeration基类)

如果你的项目里用的是自定义的Enumeration基类(而非C#原生Enum),可以把验证逻辑直接封装到枚举类内部:

public class ScheduleType : Enumeration
{
    public static readonly ScheduleType Fixed = new ScheduleType(1, "Fixed schedule");
    public static readonly ScheduleType Rotated = new ScheduleType(2, "Rotated schedule");
    public static readonly ScheduleType FullTime = new ScheduleType(4, "FullTime schedule");
    public static readonly ScheduleType PartTime = new ScheduleType(8, "PartTime schedule");
    public static readonly ScheduleType Flexible = new ScheduleType(16, "Flexible schedule");

    private ScheduleType(int id, string name) : base(id, name) { }

    // 验证多选组合合法性的方法
    public static bool IsCombinationValid(IEnumerable<ScheduleType> selectedTypes)
    {
        var selectedIdSum = selectedTypes.Select(t => t.Id).Sum();
        var hasFixedAndRotated = (selectedIdSum & Fixed.Id) != 0 && (selectedIdSum & Rotated.Id) != 0;
        var hasFullAndPart = (selectedIdSum & FullTime.Id) != 0 && (selectedIdSum & PartTime.Id) != 0;
        
        return !hasFixedAndRotated && !hasFullAndPart;
    }
}

调用时传入选中的枚举实例集合即可完成验证。

内容的提问来源于stack exchange,提问作者Anyname Donotcare

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:41:54