如何将多个源映射到单个目标成员

时间:2019-04-03 16:05:05

标签: c# automapper

我正在尝试使用AutoMapper将不同类型的多个源映射到单个目标中,但是该目标将被映射的最后一个属性覆盖(在下面的示例中为Wire)。如何附加到目标列表,而不是将其覆盖?这是我当前注册映射的方式:

CreateMap<SourceBE, Destination()
   .ForMember(e => e.Payments, c => c.MapFrom(src => src.Checks))
   .ForMember(e => e.Payments, c => c.MapFrom(src => src.Wires))
   ;

CreateMap<CheckBE, Destination>()
   .ForMember(e => e.Id, c => c.MapFrom(src => src.Id))
   .ForMember(e => e.Amount, c => c.MapFrom(src => src.Amount))
   .ForMember(e => e.Type, c => c.MapFrom(src => PaymentType.Check))
   ;

CreateMap<WireBE, Destination>()
   .ForMember(e => e.Id, c => c.MapFrom(src => src.Id))
   .ForMember(e => e.Amount, c => c.MapFrom(src => src.Amount))
   .ForMember(e => e.Type, c => c.MapFrom(src => PaymentType.Wire))
   ;

我可以引入一个基本类型,即所有付款都共享,然后将列表连接起来,是否还有其他方法可以仅添加到目标列表上?

1 个答案:

答案 0 :(得分:0)

我最终使用AfterMap()解决了问题。

.AfterMap((src, dest, ctx) =>
{
   var checks = ctx.Mapper.Map<IList<Destination>>(src.Checks);
   var wires = ctx.Mapper.Map<IList<Destination>>(src.Wires);
   dest.Payments = checks.Concat(wires).ToList();
});

我发现这种方法的唯一缺点是您不能再使用ProjectTo <>(),因为它不支持AfterMap()。

所以代替这个:

.ProjectTo<Destination>()

只需执行以下操作:

Mapper.Map<Destination>(sourceBE)
如Lucian AutoMapper所述,

集合可能是另一种方法。在查阅了文档之后,我并没有真正看到这将如何帮助解决我的问题,即使这样做确实比使用AfterMap更好。