如何使用AutoMapper实现复杂嵌套类型映射 解决配置缺失报错问题
错误原因
- 目标类
DestinationObject的destinationObjectArrayField是destinationObjectArray[]数组类型,你在映射配置中直接返回单个destinationObjectArray实例,类型不匹配触发映射异常 - 没有配置嵌套类型
SourceInnerObjList到destinationInnerObject1Array的映射规则,AutoMapper无法自动识别两个自定义类型的字段对应关系
解决方案
修改CreateMapper方法的映射配置即可,完整修改后的代码如下:
public static IMapper CreateMapper() { var config = new MapperConfiguration(cfg => { cfg.AllowNullDestinationValues = true; // 先配置内层嵌套类型的映射规则,明确字段对应关系 cfg.CreateMap<SourceInnerObjList, destinationInnerObject1Array>() .ForMember(dest => dest.destinationInnerObjectItem11, o => o.MapFrom(src => src.SourceObjListItem1Id.ToString())) .ForMember(dest => dest.destinationInnerObjectItem21, o => o.MapFrom(src => src.SourceObjListItem2d.ToString())); // 配置根对象的映射规则 cfg.CreateMap<SourceObject, DestinationObject>() .ForMember(dest => dest.destinationTypeField, o => o.MapFrom(src => src.sourceTypeField)) .ForMember(dest => dest.destinationObjectArrayField, o => o.MapFrom(src => new destinationObjectArray[] { new destinationObjectArray() { mydestinationArrayField = src.SourceObj1Field.SourceObjListss.Select(x => x.SourceObjListItem1Id).FirstOrDefault().ToString(), // 直接赋值源集合,AutoMapper会自动应用上面的内层映射规则完成类型转换 dest1Array = src.SourceObj1Field.SourceObjListss.ToArray() } })); }); // 开发阶段可开启配置校验,快速定位映射缺失、不匹配问题 config.AssertConfigurationIsValid(); return config.CreateMapper(); }
核心修改点说明
- 提前声明内层自定义类型的映射规则,明确源和目标字段的对应关系
- 把
destinationObjectArrayField的返回值包裹为数组,和目标字段类型保持一致 - 集合类型映射无需手动遍历转换,AutoMapper会自动复用已配置的类型映射规则完成批量转换
如果后续需要映射dest2Array字段,同理先配置SourceInnerObj2List到destinationInnerObject2Array的映射规则即可。
内容的提问来源于stack exchange,提问作者Vignesh Kumar
相关产品推荐
相关产品推荐

