07.AutoMapper 之列表和数组(Lists and Arrays)

列表和数组(Lists and Arrays)

AutoMapper只需要配置元素类型的映射配置,不需要针对列表和数组进行配置。举个例子,我们可能有以下源类型和目标类类型:

public class Source
{
    public int Value { get; set; }
}

public class Destination
{
    public int Value { get; set; }
}

所有的基础泛型集合类型都支持:

Mapper.Initialize(cfg => cfg.CreateMap());

var sources = new[]
    {
        new Source { Value = 5 },
        new Source { Value = 6 },
        new Source { Value = 7 }
    };

IEnumerable ienumerableDest = Mapper.Map>(sources);
ICollection icollectionDest = Mapper.Map>(sources);
IList ilistDest = Mapper.Map>(sources);
List listDest = Mapper.Map>(sources);
Destination[] arrayDest = Mapper.Map(sources);

换句话说,源集合类型支持以下几种:

  • IEnumerable
  • IEnumerable
  • ICollection
  • ICollection
  • ILsit
  • IList
  • List
  • Arrays

对于非泛型的枚举类型,仅支持未映射的可分配类型,因为AutoMapper不能推算出你想尝试映射的类型。如上例所示,没有必要显式配置列表类型,只需要配置其成员类型就可以了。

当映射一个已存在的集合时,会先清空目标集合。如果这不是你想要的,那么请查看
AutoMapper.Collection

多态元素集合

很多时候,我们的源类型和目标类型都会继承至其它类型,AutoMapper支持多态数组和集合,如果存在对应的派生类型则使用

public class ParentSource
{
    public int Value1 { get; set; }
}

public class ChildSource : ParentSource
{
    public int Value2 { get; set; }
}

public class ParentDestination
{
    public int Value1 { get; set; }
}

public class ChildDestination : ParentDestination
{
    public int Value2 { get; set; }
}

AutoMapper仍然需要显式配置子映射, 因为AutoMapper不知道要使用哪一个子目标映射配置。下面举个例子:

Mapper.Initialize(c=> {
    c.CreateMap()
         .Include();
    c.CreateMap();
});

var sources = new[]
    {
        new ParentSource(),
        new ChildSource(),
        new ParentSource()
    };

var destinations = Mapper.Map(sources);

destinations[0].ShouldBeInstanceOf();
destinations[1].ShouldBeInstanceOf();
destinations[2].ShouldBeInstanceOf();

你可能感兴趣的:(07.AutoMapper 之列表和数组(Lists and Arrays))