C# AutoMapper条件映射:基于源属性值设置目标值及默认行为实现求助
解决AutoMapper根据源属性值动态设置目标成员的问题
嘿,刚接触AutoMapper就遇到这种自定义映射的需求很正常,我来给你捋捋怎么解决——你原来的写法问题在于opt.UseDestinationValue()是配置选项,不能放在MapFrom的lambda表达式里当返回值用。下面两个方案都能完美实现你的需求:
方案1:利用Condition控制映射时机
这个方案最贴合AutoMapper的设计思路,通过Condition指定什么时候执行自定义映射,什么时候沿用默认行为(保留目标值):
CreateMap<ClassA, ClassA>() .ForMember(dest => dest.PropertyA, opt => { // 仅当源PropertyB不为null时,才执行后续的MapFrom规则 opt.Condition(src => src.PropertyB != null); // 符合条件时,将目标PropertyA设为null opt.MapFrom(src => null); });
原理很简单:当src.PropertyB为null时,Condition不满足,AutoMapper会跳过这个成员的自定义映射,自动保留目标对象原本的PropertyA值,正好符合你的要求。
方案2:用ResolveUsing手动返回目标值
如果你更习惯直接控制返回逻辑,可以用ResolveUsing,它能同时访问源对象和目标对象,直接返回对应的值:
CreateMap<ClassA, ClassA>() .ForMember(dest => dest.PropertyA, opt => opt.ResolveUsing((src, dest) => src.PropertyB != null ? null : dest.PropertyA ) );
这里的逻辑一目了然:如果源PropertyB不为null,就返回null给目标PropertyA;否则直接返回目标对象原本的PropertyA值,相当于保留目标值。
两个方案都能实现你的需求,方案1更简洁,利用AutoMapper的内置机制;方案2更直观,适合后续有更复杂逻辑扩展的场景。
内容的提问来源于stack exchange,提问作者eetawil
相关产品推荐
相关产品推荐

