之前作過Object到Object的轉換方法的封裝,底層主要仍是靠反射取值賦值+循環來實現的。最近在公司裏維護舊系統,這個系統使用了WCF,當時就很好奇他們的數據契約到實體模型的轉換時怎麼作的,以後查看源碼,發現他們竟然是一個屬性一個屬性的賦值過來的,當時就給我雷到了,難道就沒有人舉得這個地方能夠封裝起來嗎?app
據我目前瞭解,有三種方法能夠實現這個實體類到實體類的轉換過程,下面來簡述下這三種方式。spa
第一種,也是最簡單的一種,是用list自帶的轉換方法,可是這種方法須要本身定義轉換規則,寫起來也挺麻煩的,因此當時只作了個小Demo給你們看,也沒有提倡使用;對象
第二種,就是用反射+泛型封裝的方法,可是這種方法只能實現簡單屬性的轉換,對於複雜對象的處理就會出現屬性賦值方面的問題;blog
第三種方法,就是使用微軟封裝的AutoMapper。源碼
接下來,本文主要簡單介紹下AutoMapper的使用。string
首先找到「程序包管理器控制檯」:it
而後輸入:io
以後使用的時候,還有加入以下using:class
using AutoMapper; //使用autoMapper須要引入此命名空間
接下來咱們來寫兩個類,並寫出兩個類具體是如何轉換的:基礎
源類:
public class Student { public int ID;//ID public string Name;//姓名 public string Sex;//性別 }
目標類;
public class StudentGoal { public int ID;//ID public string Name;//姓名 public string Sex;//性別 }
接下來看看單個實體之間的轉換和List之間的轉換:
#region 單個實體之間的轉換Demo //建立映射規則 Mapper.CreateMap<Student, StudentGoal>(); //建立一個源實體 Student StuScource = new Student { ID = 1, Name = "lhc", Sex = "girl" }; //進行轉換:將源目標轉換爲目的目標 var sGoal = Mapper.Map<StudentGoal>(StuScource); //輸出轉換後實體name Console.WriteLine(sGoal.Name); #endregion #region List之間的轉換Demo //建立轉換規則 Mapper.CreateMap<Student, StudentGoal>(); //建立源實體集合 List<Student> ListScource = new List<Student>() { new Student() {ID=1,Name ="劉慧超",Sex ="女"}, new Student() {ID=2,Name ="小七七",Sex ="女"} }; //進行轉換 List<StudentGoal> ListGoal = Mapper.Map<List<Student>, List<StudentGoal>>(ListScource); //輸出目標集合中學生姓名 foreach (var stu in ListGoal ) { Console.WriteLine(stu.Name); } #endregion
嘿嘿,感受挺方便的吧~~
這個只是個簡單的使用,AutoMapper在實體轉換方面作的仍是挺成熟的,咱們使用的時候,能夠在此基礎上再進一步封裝。