2013-05-27 3 views
0

Вот простая иерархия:Игнорировать свойства при отображении производного экземпляра типа

abstract class Base 
{ 
    public int Id { get; set; } 
} 

class Derived : Base 
{ 
    public string Name { get; set; } 
} 

Мне нужно клонировать Derived экземпляров, но я хочу, чтобы пропустить Id значения. Итак, я конфигурирование Mapper так:

 Mapper 
      .CreateMap<Base, Base>() 
      .Include<Derived, Derived>() 
      .ForMember(_ => _.Id, expression => expression.Ignore()); 

     var original = new Derived 
     { 
      Id = 1, 
      Name = "John" 
     }; 

     var clone = Mapper.Map<Derived>(original); 

     Console.WriteLine(clone.Id == 0); // writes 'False' 

Независимо от ForMember вызова, значение Id отображается.

Эта конфигурация:

 Mapper 
      .CreateMap<Derived, Derived>() 
      .ForMember(_ => _.Id, expression => expression.Ignore()); 

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

Версия Automapper - 2.2.1. Что я делаю неправильно?

ответ

1

Вы пробовали Ignore также свойство Id на карточке базового класса?

Mapper 
    .CreateMap<Base, Base>() 
    .ForMember(_ => _.Id, expression => expression.Ignore()) 
    .Include<Derived, Derived>() 
    .ForMember(_ => _.Id, expression => expression.Ignore()); 

[...] Конвенция имеет более высокий приоритет, что игнорируемые свойства в отображениях базового класса [...]

https://github.com/AutoMapper/AutoMapper/wiki/Mapping-inheritance

+0

'Включить 'возвращает' IMappingExpression '. Итак, 'ForMember (_ => _.Id, выражение => выражение.Ignore())' вызывается для 'IMappingExpression '. Следовательно, я игнорирую свойство «Id» именно в сопоставлении базового класса. Вызов 'Игнорировать' дважды (для' Base' и 'Derived') - это вздор, потому что это то же самое, что создавать отдельные сопоставления для каждого типа в иерархии. – Dennis

+0

Тем не менее, вы правы. Я читал приоритеты картографических источников более внимательно. Я думаю, что последние два (унаследованные «Игнорировать» и условные) должны быть заменены, но никто не заботится. Не ожидал такой глупой вещи от Automapper. В любом случае, спасибо! – Dennis

+0

Полезно знать. У меня все еще есть сомнения, возможно, даже невозможно добавить второй «Игнорировать» в соответствии с последней точкой приоритета: * Унаследовано Игнорировать сопоставление свойств * – polkduran

Смежные вопросы