2010-09-02 27 views
4

Je ces classes d'affaires:Polymorphisme avec AutoMapper

class BaseNode 
    { 
     public string name;   
    } 

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

Et ce DTO plat:

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

(notez comment tous les types dérivés sont représentés par une classe DTO)

J'utilise auto mapper pour faire une conversion:

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); 

Cependant, la place ci-dessous est toujours nul d'avoir la liste des enfants:

rootDto.childs[0].childs 

(à savoir seul le premier niveau enfant est mappé correctement)

Si je supprime la partie prop.Ignore, j'obtiens une erreur d'assertion que la propriété childs n'est pas mappée.

Qu'est-ce que je fais mal?

+1

Qu'est-ce que je fais mal? Vous utilisez Automapper: D lol – Omu

+0

quel est le problème avec cela? –

Répondre

-2

Vous n'avez pas de propriétés dans vos classes public string Name {get;set;}, vous avez des champs publics, je pense que ce problème

également afin de cartographier ce cours vous suffit de créer 2 cartes simples

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

le champ de nom n'est pas le problème - il fonctionne de toute façon. en utilisant les cartes ci-dessus ne résout pas le problème. –

+0

@Yaron Naveh Je voulais dire que vous utilisez des champs au lieu de propriétés, la différence est que les propriétés ont des getters et des setters, les champs ne – Omu

0

C'est vieux, mais je suis tombé sur ça en cherchant autre chose ... Vous lui dites d'ignorer le champ childs. AutoMapper fait ce qu'on lui a dit de faire.

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