C# Automapper-如何将两个复杂集合映射到一个目标集合对象
我有两个不同的对象,希望将它们映射到一个目标对象。源对象是包含多个子对象的复杂对象,这些子对象也需要映射。我尝试了与下面的示例类似的方法,但正如预期的那样,最后一个映射将覆盖以前的任何映射C# Automapper-如何将两个复杂集合映射到一个目标集合对象,c#,automapper,C#,Automapper,我有两个不同的对象,希望将它们映射到一个目标对象。源对象是包含多个子对象的复杂对象,这些子对象也需要映射。我尝试了与下面的示例类似的方法,但正如预期的那样,最后一个映射将覆盖以前的任何映射 CreateMap<sourceObject, destinationObject>() .ForMember(d => d.Addresses, o => o.MapFrom(s => s.Addresses.MainAddresses)) .ForMember(d =>
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))
CreateMap()
.FormMember(d=>d.Addresses,o=>o.MapFrom(s=>s.Addresses.MainAddresses))
.FormMember(d=>d.Addresses,o=>o.MapFrom(s=>s.Addresses.SomeOtherAddresses))
我想我正在寻找类似于MapFrom()和tenmapfrom()的方法(连接或联合类型转换)
我使用了一个自定义值解析器来解决这个问题,但在我看来,这似乎违背了automapper的目的。任何其他建议都将受到欢迎。如果您希望在地址中连接映射结果(MainAddresses到Addresses和SomeOtherAddresses到Addresses),一种解决方案是
CreateMap<sourceObject, destinationObject>()
.ForMember(
d => d.Addresses,
o => o.MapFrom(
s => s.Addresses.MainAddresses
.Cast<object>()
.Concat(s.Addresses.SomeOtherAddresses)))
CreateMap()
福门博先生(
d=>d.地址,
o=>o.MapFrom(
s=>s.Addresses.MainAddresses
.Cast()
.Concat(s.address.someotheraddress)))
或
CreateMap()
福门博先生(
d=>d.地址,
o=>o.MapFrom(
s=>s.Addresses.MainAddresses
.Cast()
.Concat(s.address.someotheraddress)))
如果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());
CreateMap()
.在地图之前(
(s,d,c)=>
{
var mainAddresses=c.Mapper.Map(s.Addresses.mainAddresses);
var someOtherAddresses=c.Mapper.Map(s.Addresses.someOtherAddresses);
d、 地址=主地址
.Concat(其他地址)
.ToArray();
})
.ForMember(d=>d.Addresses,o=>o.Ignore());
在这种情况下,应该忽略地址映射,因为我们在BeforeMap中“手动”进行映射。不幸的是,这两种解决方案并不像大多数简单的automapper规则那样优雅。集合在映射之前被清除。检查。哈,是的,我意识到了困难的方法:)AutoMapper.Collection可能会有帮助。感谢witalego的解决方案,但是main address
和someotheraddress
对象不幸不一样,因此我无法对它们进行强制转换或强制转换:(我真的需要从每个属性中剖析某些属性,并将它们分别映射到目标属性。请使用BeforeMap尝试第二个属性,而不使用castingYes,我真的应该这样做,而且效果很好!比我的自定义解析程序优雅得多。非常感谢您让我了解这一点:)
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());