如何使用AutoMapper在映射前将Policy源对象替换为GetEffective返回值?
解决AutoMapper映射前替换源对象的问题
问题描述
我有如下Policy类:
public class Policy { // some members public Policy GetEffective() { // run some logic return mergedPolicy; } }
我希望使用AutoMapper将该类型的对象映射到另一个类型,但在映射前调用GetEffective方法,并用该方法返回的对象替换原源对象。
我尝试使用BeforeMap方法,但它似乎无法作用于整个源对象,仅能操作源对象的成员。
CreateMap<Policy, PolicyResponse>() .BeforeMap((src, dest) => src = src.GetEffective());
解决方案
使用
ConvertUsing方法直接指定源对象转换逻辑,这是最直接的方式:CreateMap<Policy, PolicyResponse>() .ConvertUsing(src => { var effectivePolicy = src.GetEffective(); return Mapper.Map<PolicyResponse>(effectivePolicy); });注:如果已经存在
Policy到PolicyResponse的基础映射配置,这种方式可以直接复用,避免重复编写字段映射规则。自定义类型转换器,适合逻辑复杂或需要复用的场景:
public class PolicyToPolicyResponseConverter : ITypeConverter<Policy, PolicyResponse> { public PolicyResponse Convert(Policy source, PolicyResponse destination, ResolutionContext context) { var effectivePolicy = source.GetEffective(); return context.Mapper.Map<PolicyResponse>(effectivePolicy); } } // 注册转换器 CreateMap<Policy, PolicyResponse>() .ConvertUsing<PolicyToPolicyResponseConverter>();关于
BeforeMap无效的原因:BeforeMap中的src是引用的副本,重新赋值只会改变局部变量的指向,无法修改AutoMapper后续实际使用的源对象引用,因此无法达到替换整个源对象的效果。
内容的提问来源于stack exchange,提问作者user20395797
相关产品推荐
相关产品推荐

