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

