AutoMapper不用任何配置就可以從dynamic(動(dòng)態(tài))對(duì)象映射或映射到dynamic對(duì)象。
namespace FifthAutoMapper{ //定義一個(gè)Person類 public class Person { public int Age { get; set; } public string Name { get; set; } } //主程序 class PRogram { static void Main(string[] args) { //不需要CreateMap同樣可以映射,這就是所謂的“零配置” //Mapper.CreateMap<MyDynamicClass, Person>().ReverseMap(); //將一個(gè)動(dòng)態(tài)對(duì)象映射到一個(gè)普通實(shí)例 dynamic dynamicObj = new ExpandoObject();//ExpandoObject對(duì)象包含可在運(yùn)行時(shí)動(dòng)態(tài)添加或移除的成員 dynamicObj.Age = 103; dynamicObj.Name = "tkb至簡(jiǎn)"; Person person = Mapper.Map<Person>(dynamicObj); Console.WriteLine("person.Age={0},Name={1}", person.Age, person.Name); //將一個(gè)普通實(shí)例映射到動(dòng)態(tài)對(duì)象 dynamic dynamicObj2= Mapper.Map<ExpandoObject>(person); Console.WriteLine("dynamicObj2.Age={0},Name={1}", dynamicObj2.Age, dynamicObj2.Name); Console.Read(); } }}
關(guān)于這個(gè)程序的說明,代碼中都注釋得很清楚了,不需再多做解釋。
對(duì)象與對(duì)象之間的映射的通常用法就是將一個(gè)復(fù)雜的模型壓扁成一個(gè)更為簡(jiǎn)單的模型。為了演示需要,我這里定義幾個(gè)類,代碼如下:
namespace FifthAutoMapper{ public class Order { public Customer Customer { get; set; } public decimal GetTotal() { return 100M; } } public class Customer { public string Name { get; set; } } public class OrderDto { public string CustomerName { get; set; } public decimal Total { get; set; } }}
Order類:就是一個(gè)普通的訂單類,當(dāng)然,實(shí)際的項(xiàng)目肯定會(huì)有很多的屬性,這里為了方便演示,只保留一個(gè)屬性和一個(gè)方法。
Customer類:顧客類,定義了顧客的姓名。
OrderDto類:Order扁平化后的類,包含了特定需求的數(shù)據(jù)。
官方定義:當(dāng)使用CreateMap方法在AutoMapper中配置源類型和目標(biāo)類型時(shí),配置器會(huì)嘗試將源上的屬性和方法匹配到目標(biāo)的屬性上。如果目標(biāo)屬性的任何屬性在源類型的屬性,方法或者以Get為前綴的方法都不存在,那么AutoMapper會(huì)把目標(biāo)成員的名稱(按照PascalCase慣例)分割成獨(dú)立的單詞。
下面測(cè)試一下,在Main方法中添加如下代碼:
Mapper.CreateMap<Order, OrderDto>();var order = new Order(){ Customer = new Customer() {Name = "tkb至簡(jiǎn)"},};var orderDto= Mapper.Map<OrderDto>(order);Console.WriteLine(orderDto.CustomerName);Console.WriteLine(orderDto.Total);

雖然前面的博客已經(jīng)說了很多了,但這里還是在啰嗦地解釋一下。
我們?cè)贏utoMapper的Createmap方法中配置了類型映射。AutoMapper只能映射它知道的類型對(duì),因此我們使用CreateMap顯示地注冊(cè)了源/目標(biāo)類型對(duì)。為了執(zhí)行映射,我們使用Map方法。
在OrderDto類中,Total屬性匹配到了Order上的GetTotal方法。CustomerName屬性匹配到了Order上的Customer.Name屬性。總之,只要合適地命名目標(biāo)類型屬性,我們就不必配置單獨(dú)的屬性匹配。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注