[非專業翻譯] Mapster - 使用特性標籤配置對映

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

[非專業翻譯] 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>(),使用 UseDestinationValueItems 在對映時不會建立新物件,而是直接使用已經例項化的集合物件:

public class Order {
    public string Id { get; set; }

    [UseDestinationValue]
    public ICollection<OrderItem> Items { get; } = new List<OrderItem>();
}

相關文章