如何在C#和ASP.NET Core中用泛型实现通用方法避免代码重复
用泛型方法消除重复代码的解决方案
要解决两个方法内部逻辑完全一致仅参数类型不同的问题,你可以通过泛型方法+类型约束的方式重构,具体步骤如下:
1. 定义通用接口(关键前提)
首先需要确保CreateOrderCommand和CreateOrderCommandSH拥有方法内部用到的共同属性/行为,为此定义一个通用接口,包含所有业务逻辑中需要访问的成员:
public interface IOrderCommand { // 这里添加两个命令类共有的属性/方法,示例: Guid CustomerId { get; } List<OrderItemDto> Items { get; } // 其他业务逻辑依赖的成员... }
2. 让命令类实现接口
修改两个命令类,实现上述接口,确保它们的共同成员符合接口定义:
public class CreateOrderCommand : IOrderCommand { // 原有属性 public Guid CustomerId { get; set; } public List<OrderItemDto> Items { get; set; } // 类特有属性... } public class CreateOrderCommandSH : IOrderCommand { // 原有属性 public Guid CustomerId { get; set; } public List<OrderItemDto> Items { get; set; } // 类特有属性... }
3. 编写泛型核心方法
将原有重复的业务逻辑提取到泛型方法中,通过where约束确保泛型参数是IOrderCommand的实现,这样就能安全访问接口定义的成员:
public async Task<OrderDto> ExecuteOrderOperations<T>(T request, CancellationToken cancellationToken, Domain.Entities.FoodBusiness foodBusiness) where T : IOrderCommand { // 保留原来的业务逻辑,示例: var order = new Domain.Entities.Order { CustomerId = request.CustomerId, BusinessId = foodBusiness.Id, Items = request.Items.Select(i => new Domain.Entities.OrderItem { ... }).ToList() }; // 原有操作:入库、调用服务等... await _orderRepository.AddAsync(order, cancellationToken); await _unitOfWork.SaveChangesAsync(cancellationToken); return _mapper.Map<OrderDto>(order); }
4. 可选:保留原有方法作为包装(兼容旧调用)
如果不想修改原有调用代码,可以保留原来的两个方法,让它们直接调用泛型方法(编译器会自动推断泛型参数):
public async Task<OrderDto> ExecuteOrderOperations(CreateOrderCommand request, CancellationToken cancellationToken, Domain.Entities.FoodBusiness foodBusiness) { return await ExecuteOrderOperations(request, cancellationToken, foodBusiness); } public async Task<OrderDto> ExecuteOrderOperationsForSH(CreateOrderCommandSH request, CancellationToken cancellationToken, Domain.Entities.FoodBusiness foodBusiness) { return await ExecuteOrderOperations(request, cancellationToken, foodBusiness); }
补充说明
- 如果两个命令类没有共同成员(极少出现),可暂时去掉接口约束直接用泛型,但不推荐——尽量通过接口统一依赖,避免后续维护时出现类型安全问题。
- 泛型调用时无需显式指定类型参数,编译器会根据传入的
request自动推断。
内容的提问来源于stack exchange,提问作者AZZOUNI MOHAMED AMIR
相关产品推荐
相关产品推荐

