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

Automapper映射继承IEnumerable的类时出现InvalidCastException问题求解

异常原因
  • AutoMapper默认会将所有实现了IEnumerable<T>的类型识别为集合类型,映射时自动生成List<T>类型的实例作为返回结果。你定义的ISourceCollection接口继承了IEnumerable<ISourceEntity>,因此AutoMapper处理该类型的成员时,会默认构造List<ISourceEntity>实例,但List<ISourceEntity>未实现ISourceCollection接口,赋值给ISourceCollection类型的属性时就触发了类型转换异常。
  • 你的目标类定义存在逻辑笔误:IDestinationSurvey接口的Collection属性类型声明为ISourceCollection,不符合目标类的命名和映射逻辑,正常应该声明为IDestinationCollection。
解决方案

第一步:修正目标类定义

首先将IDestinationSurvey和DestinationSurvey的Collection属性改为正确的目标接口类型:

public interface IDestinationSurvey
{
    IDestinationCollection Collection { get; set; }
}

public class DestinationSurvey : IDestinationSurvey
{
    public IDestinationCollection Collection { get; set; }
}

第二步:调整AutoMapper映射配置

显式指定自定义集合类型的映射规则,告知AutoMapper不要将其当作普通集合处理,同时指定构造逻辑:

var config = new MapperConfiguration(
    cfg =>
    {
        // 配置实体接口的映射
        cfg.CreateMap<ISourceEntity, IDestinationEntity>();
        // 配置自定义集合的映射,显式指定目标实现类,禁用默认集合处理
        cfg.CreateMap<ISourceCollection, IDestinationCollection>()
            .ConstructUsing(src => new DestinationCollection())
            .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name));
        // 配置Survey的映射
        cfg.CreateMap<SourceSurvey, DestinationSurvey>();
    });

如果你的业务需求就是目标Collection属性保持ISourceCollection类型,不需要转成目标集合类型,只需要调整ISourceCollection的映射配置即可:

var config = new MapperConfiguration(
    cfg =>
    {
        cfg.CreateMap<ISourceCollection, ISourceCollection>()
            .ConstructUsing(src => new SourceCollection());
        cfg.CreateMap<SourceSurvey, DestinationSurvey>();
    });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:45:05