AutoMapper泛型映射用ReverseMap触发ArgumentException异常求助
AutoMapper泛型映射使用ReverseMap报错原因分析
问题场景
定义了泛型实体类Tenant<TClientKey>和视图模型类TenantVM<TClientKey>,使用AutoMapper配置映射时:
- 使用
ReverseMap()链式调用会抛出异常:System.ArgumentException: 'Type AutoMapperWorker.Context.Tenant`1[TClientKey] is a generic type definition (Parameter 'type')' - 但分开显式创建双向映射(
CreateMap(typeof(TenantVM<>), typeof(Tenant<>))和CreateMap(typeof(Tenant<>), typeof(TenantVM<>)))时,映射可正常运行。
原因解析
AutoMapper的ReverseMap()方法存在设计局限性:
ReverseMap()的核心逻辑是基于已创建的封闭泛型映射(即已指定具体类型参数的泛型,比如Tenant<int>)生成反向映射,它默认不支持处理开放泛型类型(未指定类型参数的泛型定义,比如Tenant<>)。- 当对开放泛型类型调用
ReverseMap()时,方法内部无法正确识别这是开放泛型定义,会尝试将其当作普通非泛型类型处理,最终触发参数校验异常,提示该类型是泛型定义。 - 而分开调用两次
CreateMap的方式,是直接向AutoMapper注册两个独立的开放泛型映射规则,AutoMapper的开放泛型映射系统可以正确解析这种显式配置,因此能正常工作。
内容的提问来源于stack exchange,提问作者Safi Mustafa
相关产品推荐
相关产品推荐

