使用automapper转换两个IEnumerables给出默认值

时间:2017-12-04 15:31:03

标签: c# .net linq automapper ienumerable

我必须转换两个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类型的列表中。

我想在mapper配置中直接执行此操作,是否有办法执行此操作,保留IEnumerable映射?。

感谢。

1 个答案:

答案 0 :(得分:1)

如果您有基础对象的地图,则不需要这些对象的集合的地图。而是在调用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);