[非專業翻譯] Mapster - 基於規則的對映

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

[非專業翻譯] Mapster - 基於規則的對映

系列介紹

[非專業翻譯] 是對沒有中文文件進行翻譯的系列部落格,文章由機翻和譯者自己理解構成,和原文相比有所有不同,但意思基本一致。

因個人能力有限,如有謬誤之處還請指正,多多包涵。

正文

本文將說明 Mapster 基於規則的對映

基於規則的對映

Mapster 在預設情況下對映會包含所有的公開欄位和屬性,但是可以通過 IncludMemberIgnoreMember 方法改變預設的對映行為。

這兩個方法需要傳入指令引數,指令引數為以下型別:

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);

相關文章