天天看點

AutoMapper(七)

傳回總目錄

Null值替換

如果源類型的成員鍊上的屬性值為Null,Null值替換允許提供一個可替換的值。下面有兩個類Person和PersonInfo類,都有一個屬性Title(頭銜),從Person映射到PersonInfo,如果Person的屬性沒有指派,那麼PersonInfo的對應屬性值就用“屌絲”來替換。

namespace SeventhAutoMapper
{
    class Person
    {
        public string Title { get; set; } 
    }

    class PersonInfo
    {
        public string Title { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //映射
            Mapper.CreateMap<Person, PersonInfo>()
                .ForMember(dest => dest.Title, opt => opt.NullSubstitute("屌絲"));//源屬性如果為null,置為“屌絲”
            //執行映射
            var personInfo = Mapper.Map<PersonInfo>(new Person());//源屬性未指派,故為null
          var personInfo2 = Mapper.Map<PersonInfo>(new Person(){Title = "高富帥"});//源屬性有值
            //輸出結果
            Console.WriteLine("personInfo.Title=" + personInfo.Title);
          Console.WriteLine("personInfo2.Title=" + personInfo2.Title);
          Console.Read();
        }
    }
}      

測試結果如下:

AutoMapper(七)

開放泛型

AutoMapper支援開放泛型映射。下面建立兩個泛型類:

class Soure<T>
{
    public T Value { get; set; }
}

class Destination<T>
{
    public T Value { get; set; }
}      

我們不需要建立封閉的泛型類型(也就是不将具體的類型寫死在尖括号内),AutoMapper在運作時會将開放泛型的任何配置應用到關閉的映射上去。

//建立開放泛型的映射
Mapper.CreateMap(typeof(Source<>),typeof(Destination<>));

var src1 = new Source<int> {Value = 22};
var dest1= Mapper.Map<Destination<int>>(src1);
Console.WriteLine(dest1.Value);

var src2  = new Source<string> {Value = "Hello,AutoMapper!"};
var dest2 = Mapper.Map<Destination<string>>(src2);
Console.WriteLine(dest2.Value);

//......依次類推
Console.Read();      
AutoMapper(七)

因為C#隻允許關閉的泛型形參,是以必須使用不帶泛型參數的CreateMap方法來建立自己的開放泛型參數映射,同時可以使用所有可以利用的映射配置。AutoMapper在配置驗證期間會跳過開放泛型類型映射。

也可以建立一個開放泛型轉換器:

Mapper.CreateMap(typeof(Source<>), typeof(Destination<>)).ConvertUsing(typeof(Converter<>));      

投影

通過扁平化對象模型,将一個源類型轉換成一個目标類型。不需要額外的配置,AutoMapper隻要求一個扁平的目标類型能比對源類型的命名結構。當把一個源值投影到一個不精準比對源結構的目标值時,必須指明成員映射定義。

舉個栗子,我們想把一個源結構CalendarEvent轉成一個在Web頁面上友善使用者輸入的目标結構CalendarEventForm:

public class CalendarEvent
{
    public DateTime Date { get; set; }
    public string Title { get; set; }
}

public class CalendarEventForm
{
    public DateTime EventDate { get; set; }
    public int EventHour { get; set; }
    public int EventMinute { get; set; }
    public string Title { get; set; }
}      

由于目标屬性不是很比對源屬性(CalendarEvent.Date需要成為CalendarEventForm.EventDate),我們需要在類型映射配置中指明成員的映射規則:

var calender = new CalendarEvent()
{
    Date = DateTime.Now,
    Title = "曆史性時刻"
};
//建立映射
Mapper.CreateMap<CalendarEvent, CalendarEventForm>()
    .ForMember(dest => dest.EventDate, opt => opt.MapFrom(src => src.Date.Date))
    .ForMember(dest => dest.EventHour, opt => opt.MapFrom(src => src.Date.Hour))
    .ForMember(dest => dest.EventMinute, opt => opt.MapFrom(src => src.Date.Minute));
//執行映射
var calenderForm = Mapper.Map<CalendarEventForm>(calender);
//輸出映射前的對象
Console.WriteLine("calender.Date={0},Title={1}",calender.Date,calender.Title);
//輸出映射後的對象
foreach (PropertyInfo info in calenderForm.GetType().GetProperties())
{
    Console.WriteLine(info.Name+"="+info.GetValue(calenderForm));
}      
AutoMapper(七)

好的,關于AutoMapper的系列教程就先告一段落了,當時開這系列教程的初衷是為了順利地進行項目地開發,現在會用了,關于AutoMapper的話題就暫時先放放,不過以後肯定還會有關于AutoMapper的部落格的。

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

作者: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

繼續閱讀