AutoMapper不用任何配置就可以從dynamic(動態)對象映射或映射到dynamic對象。
namespace FifthAutoMapper { //定義一個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(); //將一個動態對象映射到一個普通實例 dynamic dynamicObj = new ExpandoObject();//ExpandoObject對象包含可在運行時動態添加或移除的成員 dynamicObj.Age = 103; dynamicObj.Name = "tkb至簡"; Person person = Mapper.Map<Person>(dynamicObj); Console.WriteLine("person.Age={0},Name={1}", person.Age, person.Name); //將一個普通實例映射到動態對象 dynamic dynamicObj2= Mapper.Map<ExpandoObject>(person); Console.WriteLine("dynamicObj2.Age={0},Name={1}", dynamicObj2.Age, dynamicObj2.Name); Console.Read(); } } }
關於這個程序的說明,代碼中都注釋得很清楚了,不需再多做解釋。
對象與對象之間的映射的通常用法就是將一個復雜的模型壓扁成一個更為簡單的模型。為了演示需要,我這裡定義幾個類,代碼如下:
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類:就是一個普通的訂單類,當然,實際的項目肯定會有很多的屬性,這裡為了方便演示,只保留一個屬性和一個方法。
Customer類:顧客類,定義了顧客的姓名。
OrderDto類:Order扁平化後的類,包含了特定需求的數據。
官方定義:當使用CreateMap方法在AutoMapper中配置源類型和目標類型時,配置器會嘗試將源上的屬性和方法匹配到目標的屬性上。如果目標屬性的任何屬性在源類型的屬性,方法或者以Get為前綴的方法都不存在,那麼AutoMapper會把目標成員的名稱(按照PascalCase慣例)分割成獨立的單詞。
下面測試一下,在Main方法中添加如下代碼:
Mapper.CreateMap<Order, OrderDto>(); var order = new Order() { Customer = new Customer() {Name = "tkb至簡"}, }; var orderDto= Mapper.Map<OrderDto>(order); Console.WriteLine(orderDto.CustomerName); Console.WriteLine(orderDto.Total);
雖然前面的博客已經說了很多了,但這裡還是在啰嗦地解釋一下。
我們在AutoMapper的Createmap方法中配置了類型映射。AutoMapper只能映射它知道的類型對,因此我們使用CreateMap顯示地注冊了源/目標類型對。為了執行映射,我們使用Map方法。
在OrderDto類中,Total屬性匹配到了Order上的GetTotal方法。CustomerName屬性匹配到了Order上的Customer.Name屬性。總之,只要合適地命名目標類型屬性,我們就不必配置單獨的屬性匹配。