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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 23:40:19