我有两个不同的对象,并希望将它们映射到一个目标对象。源对象是包含多个子对象的复杂对象,这些对象也需要映射。我尝试过类似于下面示例的内容,但正如预期的那样,最后一个映射将覆盖之前的任何映射。
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()
方法(连接或联合类型转换)之类的东西。
我使用自定义值解析器来解决这个问题,但这似乎打败了我眼中的automapper的目的。任何其他建议都会受到欢迎。
答案 0 :(得分:1)
如果要在映射的映射结果(MainAddresses到Addresses和SomeOtherAddresses到地址)中连接,一个解决方案就是
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());
在这种情况下,应该忽略地址的映射,因为我们这样做&#34;手动&#34;在BeforeMap中。不幸的是,这两种解决方案都不像大多数简单的自动播放器规则那样优雅。