使用 automapper 铸造两个 IEnumerables 给出默认值

Give default value using automapper casting two IEnumerables

我必须转换两个 IEnumerables 对象,我们称它为 Obj1 和 Obj2。

为此,我使用 automapper 直接转换两个列表,如下所示:

config = new MapperConfiguration(cfg => {
            cfg.CreateMap<IEnumerable<Obj1>, IEnumerable<Obj2>>();
        });

        mapper = config.CreateMapper();

但是我有一个问题,因为我想给 Obj2 列表中的所有元素一个默认值。有没有办法做到这一点保持 IEnumerable 投?。

我想到的唯一解决方案是为元素本身创建映射器,然后在 Obj1 列表中的所有元素之间迭代并转换为类型 Obj2,如下所示:

config = new MapperConfiguration(cfg => {
        cfg.CreateMap<Obj1, Obj2>();
    });

    mapper = config.CreateMapper();

然后,在 Obj1 列表中的 foreach 元素中,强制转换并添加到类型为 Obj2 的列表。

我想直接在映射器配置中执行此操作,有没有办法做到这一点,同时保持 IEnumerable 映射?

谢谢。

如果您有基本对象的地图,则不需要这些对象集合的地图。相反,在调用 Map<TDestination>() 时设置目标类型。参见 AutoMapper Docs: Lists and Arrays

config = new MapperConfiguration(cfg => {
    cfg.CreateMap<Obj1, Obj2>()
        .ForMember(dest => dest.ShouldBeDefaulted, 
                   o => o.MapFrom(src => src.ShouldBeDefaulted == null 
                        ? TheDefaultValue : src.ShouldBeDefaulted ));
});

var source = new List<Obj1>() { new Obj1("A"), new Obj1("B")};

// tell AutoMapper that the destination should be a collection during call to Map()
Obj2[] dest = mapper.Map<Obj2[]>(source);
Assert.AreEqual(2, dest.Length);