天天看點

AutoMapper(五)

傳回總目錄

Dynamic和ExpandoObject映射

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(五)

雖然前面的部落格已經說了很多了,但這裡還是在啰嗦地解釋一下。

我們在AutoMapper的Createmap方法中配置了類型映射。AutoMapper隻能映射它知道的類型對,是以我們使用CreateMap顯示地注冊了源/目标類型對。為了執行映射,我們使用Map方法。

在OrderDto類中,Total屬性比對到了Order上的GetTotal方法。CustomerName屬性比對到了Order上的Customer.Name屬性。總之,隻要合适地命名目标類型屬性,我們就不必配置單獨的屬性比對。

如果您認為這篇文章還不錯或者有所收獲,您可以通過右邊的“打賞”功能 打賞我一杯咖啡【物質支援】,也可以點選右下角的【好文要頂】按鈕【精神支援】,因為這兩種支援都是我繼續寫作,分享的最大動力!

作者:tkb至簡

來源:http://farb.cnblogs.com/

聲明:原創部落格請在轉載時保留原文連結或者在文章開頭加上本人部落格位址,如發現錯誤,歡迎批評指正。凡是轉載于本人的文章,不能設定打賞功能,如有特殊需求請與本人聯系!

已将所有贊助者統一放到單獨頁面!簽名處隻保留最近10條贊助記錄!檢視贊助者清單

衷心感謝打賞者的厚愛與支援!也感謝點贊和評論的園友的支援!
打賞者 打賞金額 打賞日期
微信:匿名 10.00 2017-08-03
2017-08-04
5.00 2017-06-15
支付寶:一個名字499***@qq.com 2017-06-14
16.00 2017-04-08
支付寶:向京劉 2017-04-13
2017-003-08
2017-03-08
支付寶:lll20001155 2017-03-03
支付寶:她是一個弱女子 2017-03-02

繼續閱讀