Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Automapper-如何将两个复杂集合映射到一个目标集合对象_C#_Automapper - Fatal编程技术网

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());