继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

慕码人8056858
关注TA
已关注
手记 1290
粉丝 351
获赞 1325

列表和数组(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<Source, Destination>());var sources = new[]
    {        new Source { Value = 5 },        new Source { Value = 6 },        new Source { Value = 7 }
    };

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

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

  • IEnumerable

  • IEnumerable<T>

  • ICollection

  • ICollection<T>

  • ILsit

  • IList<T>

  • List<T>

  • 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<ParentSource, ParentDestination>()
         .Include<ChildSource, ChildDestination>();
    c.CreateMap<ChildSource, ChildDestination>();
});var sources = new[]
    {        new ParentSource(),        new ChildSource(),        new ParentSource()
    };var destinations = Mapper.Map<ParentSource[], ParentDestination[]>(sources);

destinations[0].ShouldBeInstanceOf<ParentDestination>();
destinations[1].ShouldBeInstanceOf<ChildDestination>();
destinations[2].ShouldBeInstanceOf<ParentDestination>();



作者:这个用户有点逗
链接:https://www.jianshu.com/p/419a3b7f12d5


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP