Вот простая иерархия:Игнорировать свойства при отображении производного экземпляра типа
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. Что я делаю неправильно?
'Включить 'возвращает' IMappingExpression '. Итак, 'ForMember (_ => _.Id, выражение => выражение.Ignore())' вызывается для 'IMappingExpression '. Следовательно, я игнорирую свойство «Id» именно в сопоставлении базового класса. Вызов 'Игнорировать' дважды (для' Base' и 'Derived') - это вздор, потому что это то же самое, что создавать отдельные сопоставления для каждого типа в иерархии. –
Dennis
Тем не менее, вы правы. Я читал приоритеты картографических источников более внимательно. Я думаю, что последние два (унаследованные «Игнорировать» и условные) должны быть заменены, но никто не заботится. Не ожидал такой глупой вещи от Automapper. В любом случае, спасибо! – Dennis
Полезно знать. У меня все еще есть сомнения, возможно, даже невозможно добавить второй «Игнорировать» в соответствии с последней точкой приоритета: * Унаследовано Игнорировать сопоставление свойств * – polkduran