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