[非專業翻譯] 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> 命名約定
如果想要修改 Poco
到 IDictionary<string, T>
對映 的欄位命名規則為 camelCase
,那麼可以修改 NameMatchingStrategy
為 NameMatchingStrategy.ToCamelCase
。
TypeAdapterConfig<Poco, Dictionary<string, object>>.NewConfig()
.NameMatchingStrategy(NameMatchingStrategy.ToCamelCase);
如果想要從 camelCase
命名規則的 IDictionary<string, T>
到 Poco
,那麼可以修改 NameMatchingStrategy
為 NameMatchingStrategy.FromCamelCase
TypeAdapterConfig<Dictionary<string, object>, Poco>.NewConfig()
.NameMatchingStrategy(NameMatchingStrategy.FromCamelCase);
注意!對映
IDictionary<string, T>
到Poco
也可以使用Flexible
或IgnoreCase
,在這兩種命名約定規則下這兩種效率比較低,
基於規則的命名
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
返回結果為空,那麼將不會重寫成員名稱