如何忽略所有目标成员,除了被映射的目标成员?
有没有办法做到这一点? 我们有一个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
返回void
, ForAllMembers(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)) ;