如何忽略所有目标成员,除了被映射的目标成员?

有没有办法做到这一点? 我们有一个SummaryDto,它映射了三种不同的types,当我们为每种types创build一个映射时,没有映射的道具会抛出一个错误。 摘要dto上有大约35个属性。 要在每一个上使用Ignore()选项就太麻烦了。 有没有全球性的忽视? 就像是

CreateMap<Source,Target>() .IgnoreAllUnmapped(); 

这对我有用:

 public static class MappingExpressionExtensions { public static IMappingExpression<TSource, TDest> IgnoreAllUnmapped<TSource, TDest>(this IMappingExpression<TSource, TDest> expression) { expression.ForAllMembers(opt => opt.Ignore()); return expression; } } 

因为ForAllMembers返回voidForAllMembers(o => o.Ignore())不使用这个扩展方法调用ForAllMembers(o => o.Ignore())将不起作用。 我们希望保留映射expression式来启用后续的映射:

 CreateMap<Source, Destination>() .IgnoreAllUnmapped() .ForMember(d => d.Text, o => o.MapFrom(s => s.Name)) .ForMember(d => d.Value, o => o.MapFrom(s => s.Id)); 

我也在这个问题上挣扎了很长一段时间,或者至less有一个类似的问题。 我有一个有很多属性的类(约30),我只想映射其中的4个。 添加26个忽略语句似乎是疯狂的(尤其是当这意味着将来的更改将意味着需要更新它们!)

我终于发现,我可以告诉AutoMapper忽略一切,然后明确地添加我想要的。

 // Create a map, store a reference to it in a local variable var map = CreateMap<Source,Target>(); // Ignore all members map.ForAllMembers(opt => opt.Ignore()); // Add mapping for P1 map.ForMember(dest => dest.P1, opt => opt.MapFrom( src => src.P1)); // Add other mappings... map.ForMember(dest => dest.P2, opt => opt.MapFrom( src => src.P2)); map.ForMember(dest => dest.P3, opt => opt.MapFrom( src => src.P3)); map.ForMember(dest => dest.P4, opt => opt.MapFrom( src => src.P4)); 

你会原谅你以为你可以这样做(但不要因为它不会编译):

 // This won't compile CreateMap<Source,Target>() .ForAllMembers(opt => opt.Ignore()) .ForMember(dest => dest.P1, opt => opt.MapFrom( src => src.P1)); 

这不起作用的原因是ForAllMembers()方法不支持stream畅的链接样式(至less在当前版本2.0中)。

好消息是非链式版本确实有效。 当然要注意的是,你需要明确地告诉AutoMapper映射哪些成员。 我还没有find一个简单的方法来实现这一点,以便您仍然可以使用隐含的映射,并忽略破坏的映射。

为了避免显式指定映射的属性,可以使用IgnoreAllNonExisting 。 它会忽略没有映射源属性的任何目标属性。

尝试使用.ConvertUsing()你的情况,例如

 CreateMap<Source,Target>() .ConvertUsing(converter=> new Target(){ P1 = converter.P1, .... }); 

所以,你可以描述所有的属性你想要在你的对象中,其他将被忽略。

扩展方法,它允许ForAllMembers方法stream利的语法:

 public static IMappingExpression<TSource, TDestination> IgnoreAllMembers<TSource, TDestination>( this IMappingExpression<TSource, TDestination> expression ) { expression.ForAllMembers(opt => opt.Ignore()); return expression; } 

用法:

对IgnoreAllMembers的调用必须在ForMember调用之前。

  CreateMap<LocationRevision, Dto.LocationAddressMap>() .IgnoreAllMembers() .ForMember(m => m.LocationId, opt => opt.MapFrom(src => src.Id)) ;