2013-02-01 50 views
1

我有在我需要映射像這樣的情況:Automapper映射類型亞型

public class Event 
{ 
    string Name {get;set;} 
    int EventType {get;set;} 
    SubType Sub {get;set;} 
} 

的問題是,這樣子類型裏面應該映射由的在EventType屬性決定Event類。對於不同類型的事件,我想要映射不同的事物。

通常的方法是創建兩個事件和子類型的地圖 - 它們不是相互關聯的:

map.CreateMap<EventDTO, Event>(); 
map.CreateMap<SubTypeDTO, SubType>(); 

我怎麼能告訴automapper改變基礎上,Event.EventType亞型映射行爲?

PS>我知道這是不好的設計,它真的應該通過重構整個事情得到解決(例如移除事件類型和創建子類) 不幸的是我繼承了這個代碼,只是需要解決的bug無需花費要多少時間。

+0

嗨,我運行到同樣的問題。一個屬性,指示映射到哪個子類型,另一個屬性是BASE類型。 Automapper總是映射基類而不是子類。你是如何使用ResolveUsing解決這個問題的?如果你能告訴我,我會很感激。謝謝。 – Anshul

+0

嘿!我知道這已經過了一年多了,你最終以不同的方式修復它,但是你能否將我的迴應標記爲你的問題的答案?我有點需要點☺ 謝謝! – Silvestre

回答

2

我不知道是否有什麼東西要實現這一點,但你可以做到以下幾點:

Mapper.CreateMap<EventDTO, Event>() 
      .ForMember(to => to.Name, from => from.Ignore()) 
      .ForMember(to => to.Sub, from => from.Ignore()) 
      .ForMember(to => to.EventType, from => from.Ignore()) 
      .AfterMap((source, dest) => 
          { 
           switch (dest.EventType) 
           { 
            case 1: 
             // Behaviour EventType 1 
             ... 
             dest.Name = source.NameDTO + "1"; 
             ... 
             break; 
            case 2: 
             // Behaviour EventType 2 
             ... 
             dest.Name = source.NameDTO + "2"; 
             ... 
             break; 
            default: 
             // Behaviour EventType 3 
             ... 
             dest.Name = source.NameDTO + "0"; 
             ... 
             break; 
           } 
          }); 
+1

感謝這個解決方案,儘管我已經解決了這個問題:使用'ResolveUsing <>()'並創建一個自定義解析器。它可以訪問父級實體以及子級實體。 – kubal5003

相關問題