[非專業翻譯] 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.Child
為 null
,那麼對映到 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);
對映兩個型別到一個型別
如果想將 Dto1
與Dto2
兩個型別對映到 Poco
型別,那麼可以通過將 Dto1
Dto2
包裝成一個 tuple,然後將 tuple.Item1
和 tuple.Item2
對映到 Poco
來實現:
TypeAdapterConfig<(Dto1, Dto2), Poco>.NewConfig()
.Map(dest => dest, src => src.Item1)
.Map(dest => dest, src => src.Item2);