2012-02-02 40 views
2

我有以下的情況(C#):Automapper意外行爲地圖繼承類型之間

public class A: B 
{ 
     public ComplexType MyCT {get;set;} 

} 

public class B: 
{ 
     public string MyString {get;set;} 

} 

我有一個實例,我想用Automapper到它映射到B的實例作爲後映射我不需要「MyCT」(顯然這是一個減少的版本)。

B myB = Mapper.Map<A, B>(myA); 

但是當我嘗試做一些MYB(我將其保存到Azure中不能處理我的複雜類型,因此想如果你喜歡把它扔掉)拋出一個異常,告訴我說MyCT仍然圍繞着myB對象。

當我調試我可以把它投給A,果然我可以訪問MyCT。

什麼是缺少的,我覺得我從根本上失去了一些東西在這裏大概是與兩種類型之間的繼承。

+0

什麼是Mapper.CreateMap()表達式是什麼樣子?我的賭注是你沒有一個。 – 2012-02-02 18:05:51

+0

謝謝大家!不用說你們都是對的。我確實有過CreateMaps(我之前使用過很多次Automapper),但是我調用它的方法沒有被調用。現在已經很晚了,我認爲我給Map的電話會拋出某種「Automapper not set up」異常 - 哦! – ozz 2012-02-03 09:06:06

回答

2

看起來你沒有爲兩種類型的是簡單地定義一個映射:

Mapper.CreateMap<A, B>(); 

(如果你看一看的Getting Started引導它給你如何集中這些映射一些提示配置在應用程序啓動一個地方。)

它看起來像,如果沒有這兩種類型之間的映射關係已經確定,Automapper是回落到您的A實例的B類型的上溯造型。您實際上想要實現一個flattening Automapper只能知道兩種類型之間的映射明確。

下面是說明了這一個代碼示例:

using System; 
using AutoMapper; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     B b = Mapper.Map<A, B>(new A()); 
     Console.WriteLine(b.GetType()); //A 

     Mapper.CreateMap<A, B>();  //define the mapping 
     b = Mapper.Map<A, B>(new A()); 
     Console.WriteLine(b.GetType()); //B 

     Console.ReadLine(); 
    } 
} 

public class A: B 
{ 
} 

public class B 
{ 
} 
1

添加Mapper.CreateMap<A, B>()