zoukankan      html  css  js  c++  java
  • [非专业翻译] Mapster 自定义命名约定

    [非专业翻译] Mapster - 自定义命名约定

    系列介绍

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

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

    正文

    本文将说明 Mapster 的 自定义命名约定

    Flexible

    Mapster 默认在映射时会区分名称大小写,可以通过修改配置器的 NameMatchingStrategy 值为 NameMatchingStrategy.Flexible 来支持更加灵活的名称映射规则,这个映射规则支持名称在 PascalCase, camelCase, lower_case, UPPER_CASE 之间互相映射:

    //global
    TypeAdapterConfig.GlobalSettings.Default.NameMatchingStrategy(NameMatchingStrategy.Flexible);
    
    //type pair
    TypeAdapterConfig<Foo, Bar>.NewConfig().NameMatchingStrategy(NameMatchingStrategy.Flexible);
    

    忽略大小写

    当存在一个名称为 MiXcAsE 到名称为 MixCase 的映射时, NameMatchingStrategy.Flexible 无法支持,因为它会把 MiXcAsE 处理为 Mi-Xc-As-E,因此我们应当使用 NameMatchingStrategy.IgnoreCase 来实现这个映射:

    TypeAdapterConfig.GlobalSettings.Default.NameMatchingStrategy(NameMatchingStrategy.IgnoreCase);
    

    成员名称的 前缀、后缀和替换

    如果存在以下的类型:

    public class Poco
    {
        public string Name { get; set; }
        public string Desc { get; set; }
        public int Age { get; set; }
    
    }
    
    public class Dto
    {
        public string m_Name { get; set; }
        public string m_Desc { get; set; }
        public int m_Age { get; set; }
    }
    

    可以使用 Map 方法配置每个属性的映射,但这样会大大的增加编码工作量。

    在这个时候就可以使用 ConvertSourceMemberName 配置源类型的成员命名,来实现需求:

    TypeAdapterConfig<Poco, Dto>.NewConfig()
       .NameMatchingStrategy(NameMatchingStrategy.ConvertSourceMemberName(name => "m_" + name));
    

    同样也可以使用 ConvertDestinationMemberName 配置目标类型的成员命名来实现需求:

    TypeAdapterConfig<Poco, Dto>.NewConfig()
       .NameMatchingStrategy(NameMatchingStrategy.ConvertDestinationMemberName(name => name.Replace("m_", "")));
    

    IDictionary<string, T> 命名约定

    如果想要修改 PocoIDictionary<string, T> 映射 的字段命名规则为 camelCase,那么可以修改 NameMatchingStrategyNameMatchingStrategy.ToCamelCase

    TypeAdapterConfig<Poco, Dictionary<string, object>>.NewConfig()
        .NameMatchingStrategy(NameMatchingStrategy.ToCamelCase);
    

    如果想要从 camelCase 命名规则的 IDictionary<string, T>Poco,那么可以修改 NameMatchingStrategyNameMatchingStrategy.FromCamelCase

    TypeAdapterConfig<Dictionary<string, object>, Poco>.NewConfig()
        .NameMatchingStrategy(NameMatchingStrategy.FromCamelCase);
    

    注意!映射 IDictionary<string, T>Poco也可以使用 FlexibleIgnoreCase,在这两种命名约定规则下这两种效率比较低,

    基于规则的命名

    Mapster 支持重写成员的名称,通过 GetMemberName 方法可实现。

    例如,通过在类的属性上标记 JsonProperty 特性指定属性名称:

    public class Poco 
    {
        [JsonProperty("code")]
        public string Id { get; set; }
    }
    

    通过 GetMemberName 方法配置读取成员的 JsonPropertyAttribute 特性获取属性名称:

    TypeAdapterConfig.GlobalSettings.Default
        .GetMemberName(member => member.GetCustomAttributes(true)
                                        .OfType<JsonPropertyAttribute>()
                                        .FirstOrDefault()?.PropertyName
        );  //if return null, property will not be renamed
    

    注意!如果 GetMemberName 返回结果为空,那么将不会重写成员名称

    目前学习.NET Core 最好的教程 .NET Core 官方教程 ASP.NET Core 官方教程
    如果您认为这篇文章还不错或者有所收获,您可以点击右下角的【推荐】支持,或请我喝杯咖啡【赞赏】,这将是我继续写作,分享的最大动力!
    声明:原创博客!请在转载时在文章开头注明本人博客地址。如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!
  • 相关阅读:
    理解dajngo ORM查询中select_related的作用
    Django 模型层 Meta 选项详解
    token和session的区别
    Python 爬虫 urllib、urllib2、urllib3用法及区别
    linux里面访问一个链接的方法
    scrapy-redis实现全站分布式数据爬取
    linux shell 操作 mysql命令(不进入mysql操作界面)
    后台+下载(wget)+多个下载url
    维基下载页面说明(指南)
    pytorch --Rnn语言模型(LSTM,BiLSTM) -- 《Recurrent neural network based language model》
  • 原文地址:https://www.cnblogs.com/staneee/p/14913650.html
Copyright © 2011-2022 走看看