[非專業翻譯] Mapster - 使用特性標籤配置對映
系列介紹
[非專業翻譯] 是對沒有中文文件進行翻譯的系列部落格,文章由機翻和譯者自己理解構成,和原文相比有所有不同,但意思基本一致。
因個人能力有限,如有謬誤之處還請指正,多多包涵。
正文
本文將說明 Mapster 的 特性標籤配置對映
AdaptIgnore 特性
當一個屬性有 [AdaptIgnore]
標記時,這個屬性將不會被對映:
public class Product {
public string Id { get; set; }
public string Name { get; set; }
[AdaptIgnore]
public decimal Price { get; set; }
}
當一個成員有 [AdaptIgnore]
標記時,不管是 源到目標 還是 目標到源 的對映都將會忽略這個成員,可以使用 MemberSide
指定單方的忽略。
例如,只有 Product
當作 源對映時,Price
欄位才會被忽略:
public class Product {
public string Id { get; set; }
public string Name { get; set; }
[AdaptIgnore(MemberSide.Source)]
public decimal Price { get; set; }
}
忽略自定義的 Attribute
Mapster 還支援忽略標記了任何 Attribute 的屬性,使用 IgnoreAttribute
方法指定要忽略的 Attribute 。
例如,忽略所有標記了 JsonIgnoreAttribute
的屬性:
TypeAdapterConfig.GlobalSettings.Default
.IgnoreAttribute(typeof(JsonIgnoreAttribute));
IgnoreAttribute
的對映配置會在 源到目標 和 目標到源 時生效,如果只想在單方生效,可以使用 IgnoreMember
方法實現:
config.IgnoreMember((member, side) => member.HasCustomAttribute(typeof(NotMapAttribute)) && side == MemberSide.Source);
AdaptMember 特性標記
對映到不同的名稱
使用 [AdaptMember]
特性標記可以實現修改對映的名稱。
例如,將 Id
對映為 Code
:
public class Product {
[AdaptMember("Code")]
public string Id { get; set; }
public string Name { get; set; }
}
對映非公開成員
使用 [AdaptMember]
特性標記可以實現對映非公開成員:
public class Product {
[AdaptMember]
private string HiddenId { get; set; }
public string Name { get; set; }
}
根據自定義屬性重新命名成員
Mapster 支援重寫成員的名稱,通過 GetMemberName
方法可實現。
例如,通過在類的屬性上標記 JsonProperty
特性指定屬性名稱:
TypeAdapterConfig.GlobalSettings.Default
.GetMemberName(member => member.GetCustomAttributes(true)
.OfType<JsonPropertyAttribute>()
.FirstOrDefault()?.PropertyName); //if return null, property will not be renamed
注意!如果
GetMemberName
返回結果為空,那麼將不會重寫成員名稱
包括自定義 Attribute
可以使用 IncludeAttribute
實現根據成員擁有的標記特性來對映非公開的成員。
例如,對映所有標記了 JsonPropertyAttribute
的非公開成員:
TypeAdapterConfig.GlobalSettings.Default
.IncludeAttribute(typeof(JsonPropertyAttribute));
目標值
[UseDestinationValue]
特性標記可以讓 Mapster 使用現有的值來做對映,而不是建立例項化新物件。
例如下面的例子,Items
屬性預設為 new List<OrderItem>()
,使用 UseDestinationValue
後 Items
在對映時不會建立新物件,而是直接使用已經例項化的集合物件:
public class Order {
public string Id { get; set; }
[UseDestinationValue]
public ICollection<OrderItem> Items { get; } = new List<OrderItem>();
}