[非專業翻譯] Mapster - 自定義命名約定

玩雙截棍的熊貓發表於2021-06-27

[非專業翻譯] 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 返回結果為空,那麼將不會重寫成員名稱

相關文章