Полиморфизм с AutoMapper - PullRequest
       19

Полиморфизм с AutoMapper

4 голосов
/ 02 сентября 2010

У меня есть эти бизнес-классы:

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 part, я получаю ошибку подтверждения, что свойство childs не сопоставлено.

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 31 июля 2013

Это старый, но наткнулся на него в поисках чего-то другого ... Вы говорите, чтобы он игнорировал дочернее поле.AutoMapper делает то, что ему было сказано.

.ForMember(s => s.childs, prop => prop.Ignore());
0 голосов
/ 03 сентября 2010

У вас нет свойств в ваших классах public string Name {get;set;}, у вас есть открытые поля, я думаю, что это проблема

также для того, чтобы отобразить эти классы, вам нужно всего лишь создать 2 простые карты

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