zoukankan      html  css  js  c++  java
  • 07.AutoMapper 之列表和数组(Lists and Arrays)

    https://www.jianshu.com/p/419a3b7f12d5

    列表和数组(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>();
  • 相关阅读:
    数据库中的大数据字段和二进制大数据字段(图片)
    mysql中的存储过程和事务隔离
    关于数据库的三个范式的详解
    mysql与java的之间的连接
    mysql中的第三范式
    如何设置ssh安全只允许用户从指定的IP登陆
    MySQL 出现 The table is full 的解决方法
    ssh "openssh-daemon is stopped"操作之伤+sftp访问“-bash: /dev/null: Permission denied”
    CentOS 6 用SVN自动提交文件到web服务器
    centos下pg_dump的服务器版本不匹配问题
  • 原文地址:https://www.cnblogs.com/zengpeng/p/11059904.html
Copyright © 2011-2022 走看看