实现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
相关产品推荐
相关产品推荐

