[非專業翻譯] Mapster - 基於規則的對映
系列介紹
[非專業翻譯] 是對沒有中文文件進行翻譯的系列部落格,文章由機翻和譯者自己理解構成,和原文相比有所有不同,但意思基本一致。
因個人能力有限,如有謬誤之處還請指正,多多包涵。
正文
本文將說明 Mapster 基於規則的對映
基於規則的對映
Mapster 在預設情況下對映會包含所有的公開欄位和屬性,但是可以通過 IncludMember
和 IgnoreMember
方法改變預設的對映行為。
這兩個方法需要傳入指令引數,指令引數為以下型別:
public interface IMemberModel
{
Type Type { get; }
string Name { get; }
object Info { get; }
AccessModifier SetterModifier { get; }
AccessModifier AccessModifier { get; }
IEnumerable<object> GetCustomAttributes(bool inherit);
}
public enum MemberSide
{
Source,
Destination,
}
不對映欄位
可以通過檢查成員的型別來決定是否對映,成員的型別分為 PropertyInfo
, FieldInfo
, ParameterInfo
幾種。
下面這個例子實現了 如果成員型別為 FieldInfo
忽略對映的效果:
TypeAdapterConfig.GlobalSettings.Default
.IgnoreMember((member, side) => member.Info is FieldInfo);
只允許對映指定的型別
通過型別過濾
只對映存在 validTypes
集合中的型別的成員
TypeAdapterConfig.GlobalSettings.Default
.IgnoreMember((member, side) => !validTypes.Contains(member.Type));
通過名稱空間過濾
只對映型別名稱空間以 System
開頭的成員:
TypeAdapterConfig.GlobalSettings.Default
.IgnoreMember((member, side) => !member.Type.Namespace.StartsWith("System"));
對映非公開成員
如果想要對映非公開成員,可以檢視下面的例子:
TypeAdapterConfig.GlobalSettings.Default
.IncludeMember((member, side) => member.AccessModifier == AccessModifier.Internal
|| member.AccessModifier == AccessModifier.ProtectedInternal);
只對映擁有 [DataMember] 特性標記的成員
如果想要只對映擁有 [DataMember]
特性標記的成員,可以檢視下面的例子一樣:
TypeAdapterConfig.GlobalSettings.Default
.IncludeMember((member, side) => member.GetCustomAttributes(true).OfType<DataMemberAttribute>().Any());
TypeAdapterConfig.GlobalSettings.Default
.IgnoreMember((member, side) => !member.GetCustomAttributes(true).OfType<DataMemberAttribute>().Any());
只對映公開set的屬性
Mapster 預設會對映 set
不公開的屬性,可以使用以下程式碼關閉此功能:
TypeAdapterConfig.GlobalSettings.Default
.IgnoreMember((member, side) => side == MemberSide.Destination
&& member.SetterModifier != AccessModifier.Public);