如何在继承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
相关产品推荐
相关产品推荐

