AutoMapper配置Profile后仍报Missing type map,提示Object→GroceryItem是什么原因?
报错提到Object类型的原因
你调用mapper.Map<TVeganItem>(entity)时,入参entity的编译时类型是泛型参数TVeganItemEstablishmentDto,AutoMapper在编译阶段无法获取泛型参数的实际类型,只能将其识别为基类object,所以即使运行时entity是具体的Dto类型,报错信息还是会显示源类型为Object。
同时你当前的代码存在映射逻辑错误:你配置的是GroceryItemEstablishmentDto和GroceryItemEstablishment的互转、GroceryItemDto和GroceryItem的互转,没有配置GroceryItemEstablishmentDto直接转GroceryItem的映射规则,这也是报错的核心原因。
解决方案
根据你的业务场景选择对应方案即可:
- 如果你的需求是转换
entity中嵌套的VeganItem属性,直接修改映射的源对象即可:
// 原错误写法 var x = mapper.Map<TVeganItem>(entity); // 修改后写法 var x = mapper.Map<TVeganItem>(entity.VeganItem);
- 如果确实需要将整个
TVeganItemEstablishmentDto实例直接转换为TVeganItem类型,需要在AutoMapper的Profile中补充对应映射规则,示例如下:
public GroceryItemEstablishmentProfile() { // 原有映射保留 CreateMap<GroceryItemEstablishment, GroceryItemEstablishmentDto>(); CreateMap<GroceryItemEstablishmentDto, GroceryItemEstablishment>(); // 新增EstablishmentDto转GroceryItem的映射 CreateMap<GroceryItemEstablishmentDto, GroceryItem>() // 示例:将EstablishmentDto中VeganItem属性的字段直接映射到目标GroceryItem .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.VeganItem.Id)) .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.VeganItem.Name)) // 其余字段按需配置 ; }
- 如果是泛型场景下需要规避编译期类型识别问题,可以使用指定运行时类型的Map重载:
var x = (TVeganItem)mapper.Map(entity, entity.GetType(), typeof(TVeganItem));
内容的提问来源于stack exchange,提问作者BeniaminoBaggins
相关产品推荐
相关产品推荐

