C#调度服务如何通过单方法处理两个相似领域类的列表生成需求
最优解决方案:泛型方法+公共接口
这个方案既能完全复用逻辑,又能保证两个领域类的数据隔离,是C#中处理同类场景的标准实现方式。
实现步骤
- 定义公共接口提取共有属性
把两个领域类中过滤逻辑需要用到的所有公共属性,封装到同一个接口里,再让两个类分别实现该接口:
// 公共接口:存放两个类共有的属性(所有Where条件用到的属性都要放到这里) public interface ISchedulingItem { DateTime AppointmentTime { get; set; } string ContactPhone { get; set; } int OrderStatus { get; set; } // 其他需要用到的公共属性按需补充 } // 确认类实现接口 public class ConfirmationItem : ISchedulingItem { // 确认类独有的属性 public DateTime ConfirmExpireTime { get; set; } // 实现接口的公共属性 public DateTime AppointmentTime { get; set; } public string ContactPhone { get; set; } public int OrderStatus { get; set; } } // 改期类实现接口 public class ReschedulingItem : ISchedulingItem { // 改期类独有的属性 public DateTime OriginalAppointmentTime { get; set; } // 实现接口的公共属性 public DateTime AppointmentTime { get; set; } public string ContactPhone { get; set; } public int OrderStatus { get; set; } }
- 编写泛型复用逻辑
写一个泛型服务方法,给泛型参数加「必须实现ISchedulingItem」的约束,即可在方法内直接使用公共属性写统一的过滤逻辑:
// 统一的列表生成方法,泛型参数T对应具体的领域类 public List<T> GenerateSchedulingItemList<T>() where T : ISchedulingItem { // 泛型参数自动匹配对应数据表,过滤逻辑完全复用 return GenericRepository.Table<T>() .Where(item => item.OrderStatus == 1 && item.AppointmentTime > DateTime.Now.AddHours(2)) // 你原有的其他过滤、排序逻辑都可以放在这里 .ToList(); }
- 按场景调用方法
需要生成对应列表时,直接给泛型方法传入对应的领域类即可:
// 生成待确认列表 var confirmationList = GenerateSchedulingItemList<ConfirmationItem>(); // 生成待改期列表 var reschedulingList = GenerateSchedulingItemList<ReschedulingItem>();
方案优势
- 完全满足数据隔离要求:两个领域类完全独立,各自的独有属性互不干扰,不会出现业务数据混淆的问题
- 逻辑100%复用:过滤、排序等逻辑只需要维护一份,后续修改规则不需要同时改两个方法,避免出现逻辑不一致的问题
- 类型安全:编译阶段就会做类型校验,不会出现运行时类型转换报错的问题
内容的提问来源于stack exchange,提问作者Craig5117
相关产品推荐
相关产品推荐

