[非專業翻譯] Mapster – 數據類型
[非專業翻譯] Mapster – 數據類型
系列介紹
[非專業翻譯] 是對沒有中文文檔進行翻譯的系列博客,文章由機翻和譯者自己理解構成,和原文相比有所有不同,但意思基本一致。
因個人能力有限,如有謬誤之處還請指正,多多包涵。
正文
本文將說明 Mapster 中的 數據類型
基本類型
基本類型的轉換 ,例如: int/bool/dobule/decimal
,包括可空的基本類型。
只要C#支持類型轉換的類型,那麼在 Mapster 中也同樣支持轉換。
decimal i = 123.Adapt<decimal>(); //equal to (decimal)123;
枚舉類型
Mapster 會自動把枚舉映射到數字類型,同樣也支持 字符串到枚舉 和 枚舉到字符串的映射。
.NET 默認實現 枚舉/字符串 轉換非常慢,Mapster 比 .NET 的默認實現快兩倍。
在 Mapster 中,字符串轉枚舉,如果字符串為空或空字符串,那麼枚舉將初始化為第一個枚舉值。
在Mapster中,也支持標記的枚舉。
var e = "Read, Write, Delete".Adapt<FileShare>();
//FileShare.Read | FileShare.Write | FileShare.Delete
對於不同類型的枚舉,Mapster 默認將值映射為枚舉。調用 EnumMappingStrategy
方法可以指定枚舉映射方式,如:
TypeAdapterConfig.GlobalSettings.Default
.EnumMappingStrategy(EnumMappingStrategy.ByName);
字符串類型
在 Mapster 中,將其它類型映射為字符串時,Mapster 將調用類型的 ToString
方法。
如果將字符串映射為類型時,Mapster 將調用類型的 Parse
方法。
var s = 123.Adapt<string>(); // 等同於: 123.ToString();
var i = "123".Adapt<int>(); // 等同於: int.Parse("123");
集合
包括列表、數組、集合、包括各種接口的字典之間的映射: IList<T>
, ICollection<T>
, IEnumerable<T>
, ISet<T>
, IDictionary<TKey, TValue>
等等…
var list = db.Pocos.ToList();
var target = list.Adapt<IEnumerable<Dto>>();
可映射對象
Mapster 可以使用以下規則映射兩個不同的對象
- 源類型和目標類型屬性名稱相同。 例如:
dest.Name = src.Name
- 源類型有
GetXXXX
方法。例如:dest.Name = src.GetName()
- 源類型屬性有子屬性,可以將子屬性的賦值給符合條件的目標類型屬性,例如:
dest.ContactName = src.Contact.Name
或dest.Contact_Name = src.Contact.Name
示例:
class Staff {
public string Name { get; set; }
public int GetAge() {
return (DateTime.Now - this.BirthDate).TotalDays / 365.25;
}
public Staff Supervisor { get; set; }
...
}
struct StaffDto {
public string Name { get; set; }
public int Age { get; set; }
public string SupervisorName { get; set; }
}
var dto = staff.Adapt<StaffDto>();
//dto.Name = staff.Name, dto.Age = staff.GetAge(), dto.SupervisorName = staff.Supervisor.Name
可映射對象類型包括:
- 類
- 結構體
- 接口
- 實現
IDictionary<string, T>
接口的字典類型 - Record 類型 (類、結構體、接口)
對象轉換為字典的例子:
var point = new { X = 2, Y = 3 };
var dict = point.Adapt<Dictionary<string, int>>();
dict["Y"].ShouldBe(3);
Record 類型的例子:
class Person {
public string Name { get; }
public int Age { get; }
public Person(string name, int age) {
this.Name = name;
this.Age = age;
}
}
var src = new { Name = "Mapster", Age = 3 };
var target = src.Adapt<Person>();
自動映射 Record 類型有一些限制:
- Record 類型屬性必須沒有
set
- 只有一個非空構造函數
- 構造函數中的所有參數名稱必須與屬性名稱相同
如果不符合以上規則,需要增加額外的 MapToConstructor
配置