標籤:
以前做過Object到Object的轉換方法的封裝,底層主要還是靠反射取值賦值+迴圈來實現的。最近在公司裡維護舊系統,這個系統使用了WCF,當時就很好奇他們的資料契約到實體模型的轉換時怎麼做的,之後查看源碼,發現他們居然是一個屬性一個屬性的賦值過來的,當時就給我雷到了,難道就沒有人舉得這個地方可以封裝起來嗎?
據我目前瞭解,有三種方法可以實現這個實體類到實體類的轉換過程,下面來簡述下這三種方式。
第一種,也是最簡單的一種,是用list內建的轉換方法,但是這種方法需要自己定義轉換規則,寫起來也挺麻煩的,所以當時只做了個小Demo給大家看,也沒有提倡使用;
第二種,就是用反射+泛型封裝的方法,但是這種方法只能實現簡單屬性的轉換,對於複雜物件的處理就會出現屬性賦值方面的問題;
第三種方法,就是使用微軟封裝的AutoMapper。
接下來,本文主要簡單介紹下AutoMapper的使用。
一,引入
首先找到“封裝管理員控制台”:
然後輸入:
之後使用的時候,還有加入如下using:
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在實體轉換方面做的還是挺成熟的,我們使用的時候,可以在此基礎上再進一步封裝。
AutoMapper(一)——實現資料契約和實體類之間的轉換