zoukankan      html  css  js  c++  java
  • [非专业翻译] Mapster 自定义映射

    [非专业翻译] Mapster - 自定义映射

    系列介绍

    [非专业翻译] 是对没有中文文档进行翻译的系列博客,文章由机翻和译者自己理解构成,和原文相比有所有不同,但意思基本一致。

    因个人能力有限,如有谬误之处还请指正,多多包涵。

    正文

    本文将说明 Mapster 中的 自定义映射

    自定义成员的映射关系

    Mapster 支持自定义映射某个属性的值:

    TypeAdapterConfig<TSource, TDestination>
        .NewConfig()
        .Map(dest => dest.FullName,
            src => string.Format("{0} {1}", src.FirstName, src.LastName));
    

    也可以在源属性类型和目标属性类型不同时进行映射:

    TypeAdapterConfig<TSource, TDestination>
        .NewConfig()
        .Map(dest => dest.Gender,      // dest.Gender: Genders.Male 或 Genders.Female 枚举类型
            src => src.GenderString); // src.GenderString: "Male" 或 "Female" 字符串类型
    

    根据条件映射

    可以通过设置 Map 方法的第三个参数,实现在 源对象 满足某些条件下进行映射;

    当存在多个条件的情况下,Mapster 会依次往下执行判断条件是否满足,直到满足条件为止;

    当找不到满足条件的映射时,将分配空值或默认值:

    TypeAdapterConfig<TSource, TDestination>
        .NewConfig()
        .Map(dest => dest.FullName, src => "Sig. " + src.FullName, srcCond => srcCond.Country == "Italy")
        .Map(dest => dest.FullName, src => "Sr. " + src.FullName, srcCond => srcCond.Country == "Spain")
        .Map(dest => dest.FullName, src => "Mr. " + src.FullName);
    

    注意!如果想要在满足条件时跳过映射,应该使用 IgnoreIf,详情可参阅 忽略成员

    映射非公开成员

    如果存在私有成员需要映射,那么可以使用 Map 方法指定成员名称实现私有成员映射:

    TypeAdapterConfig<TSource, TDestination>
        .NewConfig()
        .Map("PrivateDestName", "PrivateSrcName");
    

    更多有关于映射非公开成员的资料,请参阅 映射非公开成员

    目标多级属性映射

    使用 Map 方法可以为 目标多级别属性配置映射:

    TypeAdapterConfig<Poco, Dto>.NewConfig()
        .Map(dest => dest.Child.Name, src => src.Name);
    

    空映射

    如果 src.Childnull,那么映射到 dest.Name 的配置不会抛出 NullPointerException ,而是映射空值:

    TypeAdapterConfig<Poco, Dto>.NewConfig()
        .Map(dest => dest.Name, src => src.Child.Name);
    

    多个源

    映射 Dto 中属性的值到 Poco

    public class Poco
    {
        public string Name { get; set; }
        public string Extra { get; set; }
    }
    
    public class Dto
    {
        public string Name { get; set; }
        public SubDto SubDto { get; set; }
    }
    public class SubDto
    {
        public string Extra { get; set; }
    }
    

    如果想将 Dto 中的所有属性和 Dto.SubDto 中的所有属性映射到 Poco,那么可以通过配置 dto.SubDto 映射到 Poco 来实现:

    TypeAdapterConfig<Dto, Poco>.NewConfig()
        .Map(poco => poco, dto => dto.SubDto);
    

    映射两个类型到一个类型

    如果想将 Dto1Dto2两个类型映射到 Poco 类型,那么可以通过将 Dto1 Dto2 包装成一个 tuple,然后将 tuple.Item1tuple.Item2 映射到 Poco 来实现:

    TypeAdapterConfig<(Dto1, Dto2), Poco>.NewConfig()
        .Map(dest => dest, src => src.Item1)
        .Map(dest => dest, src => src.Item2);
    
    目前学习.NET Core 最好的教程 .NET Core 官方教程 ASP.NET Core 官方教程
    如果您认为这篇文章还不错或者有所收获,您可以点击右下角的【推荐】支持,或请我喝杯咖啡【赞赏】,这将是我继续写作,分享的最大动力!
    声明:原创博客!请在转载时在文章开头注明本人博客地址。如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!
  • 相关阅读:
    Python3中zipfile模块文件名乱码问题
    python zipfile 文件压缩和文件
    django+celery+rabitmq
    解决 Jumpserver coco 使用登录用户(ldap)进行SSH连接目标主机,忽略系统用户
    日志实时查看、轮询、统计、监控工具 Loggrove
    python django 多级业务树形结构规划及页面渲染
    nginx+uwsgi 部署 django
    python tornado websocket 实时日志展示
    python tornado websocket 多聊天室(返回消息给部分连接者)
    python 实时遍历日志文件
  • 原文地址:https://www.cnblogs.com/staneee/p/14913647.html
Copyright © 2011-2022 走看看