[c#] 如何忽略所有目标成员,除了映射的成员?



1 Answers

我也在这个问题上挣扎了很长一段时间,或者至少是一个与此类似的问题。 我有一个有很多属性的类(大约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()方法不支持流畅的链接样式(至少在当前版本2.0中)。

好消息是非链接版本确实有效。 当然需要注意的是,您需要明确告诉AutoMapper要映射哪些成员。 我还没有找到一种简单的方法来同时使用它,这样你仍然可以使用隐含的映射并忽略破坏的映射。

Question

这个问题在这里已有答案:

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

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



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

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

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




Related