[英]AutoMapper - Map two source collections of different types into a single destination collection
[英]Automapper - how to map two complex collections to one destination collection object
我有两个不同的对象,想将它们映射到一个目标对象。 源对象是包含多个子对象的复杂对象,这些子对象也需要进行映射。 我尝试了类似于以下示例的操作,但是正如预期的那样,最后一个映射将覆盖以前的任何映射。
CreateMap<sourceObject, destinationObject>()
.ForMember(d => d.Addresses, o => o.MapFrom(s => s.Addresses.MainAddresses))
.ForMember(d => d.Addresses, o => o.MapFrom(s => s.Addresses.SomeOtherAddresses))
我想我正在寻找类似MapFrom().AndThenMapFrom()
方法( MapFrom().AndThenMapFrom()
或联合类型转换)的东西。
我使用了一个自定义值解析器来解决此问题,但是在我看来这似乎无法实现自动映射器的目的。 任何其他建议将受到欢迎。
如果要在“地址”中连接映射结果(“主地址”到“地址”和“其他地址”到“地址”),一种解决方案是
CreateMap<sourceObject, destinationObject>()
.ForMember(
d => d.Addresses,
o => o.MapFrom(
s => s.Addresses.MainAddresses
.Cast<object>()
.Concat(s.Addresses.SomeOtherAddresses)))
要么
CreateMap<sourceObject, destinationObject>()
.ForMember(
d => d.Addresses,
o => o.MapFrom(
s => s.Addresses.MainAddresses
.Cast<IAddress>()
.Concat(s.Addresses.SomeOtherAddresses)))
MainAddresses和SomeOtherAddresses中的对象是否实现IAddress接口。
另一个解决方案是在Before / AfterMap方法中执行此操作
CreateMap<sourceObject, destinationObject>()
.BeforeMap(
(s, d, c) =>
{
var mainAddresses = c.Mapper.Map<IEnumerable<Address>>(s.Addresses.MainAddresses);
var someOtherAddresses = c.Mapper.Map<IEnumerable<Address>>(s.Addresses.SomeOtherAddresses);
d.Addresses = mainAddresses
.Concat(someOtherAddresses)
.ToArray();
})
.ForMember(d => d.Addresses, o => o.Ignore());
在这种情况下,应该忽略地址映射,因为我们在BeforeMap中“手动”完成了映射。 不幸的是,这两种解决方案都不像大多数简单的自动映射器规则那样优雅。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.