Automapper - 如何将两个复杂集合映射到一个目标集合对象

时间:2018-03-15 14:52:46

标签: c# automapper

我有两个不同的对象,并希望将它们映射到一个目标对象。源对象是包含多个子对象的复杂对象,这些对象也需要映射。我尝试过类似于下面示例的内容,但正如预期的那样,最后一个映射将覆盖之前的任何映射。

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的目的。任何其他建议都会受到欢迎。

1 个答案:

答案 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中。不幸的是,这两种解决方案都不像大多数简单的自动播放器规则那样优雅。