如何在Automapper 6中映射期间忽略所有源成员的空值?

我一直在寻找各处:stackoverflow,automapper文档,互联网,只是找不到这方面的任何信息,即使这似乎是一个非常普遍的问题。

我的映射:

CreateMap() .ForAllMembers(opt => opt.Condition(src => src != null)); 

这不起作用,因为src表示源对象(StatusLevelDTO),而不是源属性(我认为)。

更具体地说,如果我将ObjectA映射到ObjectB,ObjectA.SomeValue为null而ObjectB.SomeValue为2,我希望目标对象保持其值(2)。

我已经看到了这个问题: Automapper使用自定义解析器跳过空值并尝试了前两个答案,但它们似乎都已过时版本6。

有没有办法在Automapper 6中实现这一点? 我准确地使用6.0.2。

方法Condition现在有五个重载,其中一个接受类型的谓词

 Func 

此TMember参数是源成员。 因此,您可以检查源成员是否为null:

 CreateMap() .ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null)); 

此解决方案适用于我的项目,即使用AutoMapper 6.0.2。 在之前使用AutoMapper 4的项目中,我使用了IsSourceValueNull来实现相同的行为。

我对原始解决方案做了一些小改动。 我没有检查要映射的属性的类型,而是在ForAllPropertyMaps中设置filter以检查源对象的类型,以便自定义解析器仅应用于该源对象的映射。 但是filter可以根据需要设置为任何东西。

 var config = new MapperConfiguration(cfg => { cfg.ForAllPropertyMaps( pm => pm.TypeMap.SourceType == typeof(), (pm, c) => c.ResolveUsing(new IgnoreNullResolver(), pm.SourceMember.Name)); }); class IgnoreNullResolver : IMemberValueResolver { public object Resolve(object source, object destination, object sourceMember, object destinationMember, ResolutionContext context) { return sourceMember ?? destinationMember; } }