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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM