我正在尝试使用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))
;
我可以引入一个基本类型,即所有付款都共享,然后将列表连接起来,是否还有其他方法可以仅添加到目标列表上?
答案 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更好。