2010-09-02 101 views
4

我有這方面的業務類:多態性與AutoMapper

class BaseNode 
    { 
     public string name;   
    } 

    class CompositeNode : BaseNode 
    { 
     public List<BaseNode> childs = new List<BaseNode>(); 
    } 

而且這款平板DTO:

class NodeDto 
    { 
     public string name; 
     public List<NodeDto> childs; 
    } 

(注意如何將所有的派生類型由一個DTO類來表示)

我用auto mapper做轉換:

Mapper.CreateMap<BaseNode, NodeDto>() 
       .Include<CompositeNode, NodeDto>() 
       .ForMember(s => s.childs, prop => prop.Ignore()); 

Mapper.CreateMap<CompositeNode, NodeDto>(); 

Mapper.AssertConfigurationIsValid(); 

var root = new CompositeNode() { name = "root" }; 
var child = new CompositeNode {name = "child"}; 
var child2 = new CompositeNode { name = "child2" };    
root.childs.Add(child); 
child.childs.Add(child2); 

var rootDto = Mapper.Map<CompositeNode, NodeDto>(root); 

但是下面的是不是有了孩子列表總是空:

rootDto.childs[0].childs 

(即只有第一級的孩子映射正確)

如果我刪除prop.Ignore部分,我得到一個assert錯誤,未能映射childs屬性。

我在做什麼錯?

+1

我在做什麼錯?你正在使用Automapper:D lol – Omu 2010-09-02 21:11:01

+0

那有什麼問題? – 2010-09-02 21:18:28

回答

-2

你不必在你的類public string Name {get;set;}屬性,您有公共領域,我認爲這就是問題所在

也是爲了映射這個類,你只需要創建2個簡單的地圖

Mapper.CreateMap<CompositeNode, NodeDto>(); 
Mapper.CreateMap<BaseNode, NodeDto>() 
     .ForMember(s => s.childs, prop => prop.Ignore());; 
+0

名稱字段不是問題 - 它以任何方式工作。 使用上面的地圖不能解決問題。 – 2010-09-02 21:17:58

+0

@Yaron Naveh我的意思是你用字段而不是屬性,區別在於屬性有getter和setter,字段不用 – Omu 2010-09-02 22:28:48

0

這是舊的,但遇到它尋找別的東西......你告訴它忽略孩子的領域。 AutoMapper正在做它被告知要做的事情。

.ForMember(s => s.childs, prop => prop.Ignore());