ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-06-27 19:31:35  阅读:221  来源: 互联网

标签:非专业 set 映射 自定义 get NameMatchingStrategy Mapster public TypeAdapterConfig


[非专业翻译] 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 返回结果为空,那么将不会重写成员名称

标签:非专业,set,映射,自定义,get,NameMatchingStrategy,Mapster,public,TypeAdapterConfig
来源: https://www.cnblogs.com/staneee/p/14913650.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有