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

实现ISaleOrderManager接口时出现接口成员未实现错误的原因与解决

接口实现错误原因及解决方案

问题背景

定义的接口如下:

public interface ISaleOrderManager
{
    Task<IOrderDto> CreateAsync(ICreateOrderDto request);
}

public interface ICreateOrderDto
{
    long? ContactId { get; set; }
    DateTime OrderDate { get; set; }
    double TotalAmount { get; set; }
}

public interface IOrderDto : ICreateOrderDto, IEntityDto
{ }

public interface IEntityDto
{
    long Id { get; set; }
    bool isDeleted { get; set; }
}

对应的DTO实现类:

public class CreateSaleOrderDto : ICreateOrderDto
{
    public long? ContactId { get; set; }
    public DateTime OrderDate { get; set; }
    public double TotalAmount { get; set; }
}

public class SaleOrderDto : IOrderDto
{
    public long Id { get; set; }
    public bool isDeleted { get; set; }
    public long? ContactId { get; set; }
    public DateTime OrderDate { get; set; }
    public double TotalAmount { get; set; }
}

接口实现类代码:

public class SaleOrderManager : ISaleOrderManager    
{
    private readonly IRepository<SaleOrder, long> _entityRepository;

    public SaleOrderManager(IRepository<SaleOrder, long> entityRepository)
    {
        _entityRepository = entityRepository;
    }

    public async Task<SaleOrderDto> CreateAsync(CreateSaleOrderDto request)
    {
        var entity = ObjectMapper.Map<SaleOrder>(request);

        entity.Id = await _entityRepository.InsertAndGetIdAsync(entity);

        return ObjectMapper.Map<SaleOrderDto>(entity);
    }
}

运行时出现**"Interface Member is not implemented"**错误。

错误原因

C#中实现接口方法时,方法签名必须与接口定义完全匹配,包括参数类型和返回值类型:

  • 接口定义的CreateAsync参数是ICreateOrderDto,返回值是Task<IOrderDto>
  • 实现类中的方法参数是CreateSaleOrderDto,返回值是Task<SaleOrderDto>

虽然CreateSaleOrderDto实现了ICreateOrderDto、SaleOrderDto实现了IOrderDto,但编译器不会将这种"子类替换父接口"的方法视为接口方法的实现,而是认为这是一个全新的重载方法,因此判定接口方法未被实现。

解决方案

有两种常见的解决方式:

方式1:严格匹配接口签名

直接按照接口定义的签名实现方法,在方法内部处理类型转换(如果需要):

public class SaleOrderManager : ISaleOrderManager    
{
    private readonly IRepository<SaleOrder, long> _entityRepository;

    public SaleOrderManager(IRepository<SaleOrder, long> entityRepository)
    {
        _entityRepository = entityRepository;
    }

    public async Task<IOrderDto> CreateAsync(ICreateOrderDto request)
    {
        // 确保request是预期的类型,避免类型转换错误
        if (request is not CreateSaleOrderDto createRequest)
        {
            throw new ArgumentException("请求类型必须是CreateSaleOrderDto", nameof(request));
        }

        var entity = ObjectMapper.Map<SaleOrder>(createRequest);

        entity.Id = await _entityRepository.InsertAndGetIdAsync(entity);

        return ObjectMapper.Map<SaleOrderDto>(entity);
    }
}

方式2:显式实现接口+强类型重载

既满足接口实现要求,又提供更友好的强类型调用方式:

public class SaleOrderManager : ISaleOrderManager    
{
    private readonly IRepository<SaleOrder, long> _entityRepository;

    public SaleOrderManager(IRepository<SaleOrder, long> entityRepository)
    {
        _entityRepository = entityRepository;
    }

    // 显式实现接口方法,严格匹配签名
    async Task<IOrderDto> ISaleOrderManager.CreateAsync(ICreateOrderDto request)
    {
        if (request is not CreateSaleOrderDto createRequest)
        {
            throw new ArgumentException("请求类型必须是CreateSaleOrderDto", nameof(request));
        }
        return await CreateAsync(createRequest);
    }

    // 提供强类型的重载方法,方便调用方直接使用具体DTO类型
    public async Task<SaleOrderDto> CreateAsync(CreateSaleOrderDto request)
    {
        var entity = ObjectMapper.Map<SaleOrder>(request);

        entity.Id = await _entityRepository.InsertAndGetIdAsync(entity);

        return ObjectMapper.Map<SaleOrderDto>(entity);
    }
}

这种方式下,当通过ISaleOrderManager接口调用时,会执行显式实现的方法;直接通过SaleOrderManager实例调用时,会使用强类型的重载方法,兼顾了接口契约和开发便利性。

内容的提问来源于stack exchange,提问作者Sami Ullah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:30:54