[非專業翻譯] 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);
