[非專業翻譯] Mapster - 自定義對映

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

[非專業翻譯] Mapster - 自定義對映

系列介紹

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

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

正文

本文將說明 Mapster 中的 自定義對映

自定義成員的對映關係

Mapster 支援自定義對映某個屬性的值:

TypeAdapterConfig<TSource, TDestination>
    .NewConfig()
    .Map(dest => dest.FullName,
        src => string.Format("{0} {1}", src.FirstName, src.LastName));

也可以在源屬性型別和目標屬性型別不同時進行對映:

TypeAdapterConfig<TSource, TDestination>
    .NewConfig()
    .Map(dest => dest.Gender,      // dest.Gender: Genders.Male 或 Genders.Female 列舉型別
        src => src.GenderString); // src.GenderString: "Male" 或 "Female" 字串型別

根據條件對映

可以通過設定 Map 方法的第三個引數,實現在 源物件 滿足某些條件下進行對映;

當存在多個條件的情況下,Mapster 會依次往下執行判斷條件是否滿足,直到滿足條件為止;

當找不到滿足條件的對映時,將分配空值或預設值:

TypeAdapterConfig<TSource, TDestination>
    .NewConfig()
    .Map(dest => dest.FullName, src => "Sig. " + src.FullName, srcCond => srcCond.Country == "Italy")
    .Map(dest => dest.FullName, src => "Sr. " + src.FullName, srcCond => srcCond.Country == "Spain")
    .Map(dest => dest.FullName, src => "Mr. " + src.FullName);

注意!如果想要在滿足條件時跳過對映,應該使用 IgnoreIf,詳情可參閱 忽略成員

對映非公開成員

如果存在私有成員需要對映,那麼可以使用 Map 方法指定成員名稱實現私有成員對映:

TypeAdapterConfig<TSource, TDestination>
    .NewConfig()
    .Map("PrivateDestName", "PrivateSrcName");

更多有關於對映非公開成員的資料,請參閱 對映非公開成員

目標多級屬性對映

使用 Map 方法可以為 目標多級別屬性配置對映:

TypeAdapterConfig<Poco, Dto>.NewConfig()
    .Map(dest => dest.Child.Name, src => src.Name);

空對映

如果 src.Childnull,那麼對映到 dest.Name 的配置不會丟擲 NullPointerException ,而是對映空值:

TypeAdapterConfig<Poco, Dto>.NewConfig()
    .Map(dest => dest.Name, src => src.Child.Name);

多個源

對映 Dto 中屬性的值到 Poco

public class Poco
{
    public string Name { get; set; }
    public string Extra { get; set; }
}

public class Dto
{
    public string Name { get; set; }
    public SubDto SubDto { get; set; }
}
public class SubDto
{
    public string Extra { get; set; }
}

如果想將 Dto 中的所有屬性和 Dto.SubDto 中的所有屬性對映到 Poco,那麼可以通過配置 dto.SubDto 對映到 Poco 來實現:

TypeAdapterConfig<Dto, Poco>.NewConfig()
    .Map(poco => poco, dto => dto.SubDto);

對映兩個型別到一個型別

如果想將 Dto1Dto2兩個型別對映到 Poco 型別,那麼可以通過將 Dto1 Dto2 包裝成一個 tuple,然後將 tuple.Item1tuple.Item2 對映到 Poco 來實現:

TypeAdapterConfig<(Dto1, Dto2), Poco>.NewConfig()
    .Map(dest => dest, src => src.Item1)
    .Map(dest => dest, src => src.Item2);

相關文章