Новая версия Automapper генерирует исключение приведения, когда определено отображение подтипа
Предположим, у меня есть исходный класс и два целевых класса, один более общий и еще один специфический (который наследует от более общего):
public class Source
{
public int A { get; set; }
public string Str { get; set; }
}
public class DestinationBase
{
public int A { get; set; }
}
public class DestinationDerived : DestinationBase
{
public string Str { get; set; }
}
Для Automapper 3. * этот код работал отлично:
Mapper.Initialize(cfg => {
cfg.CreateMap<Source, DestinationBase>();
cfg.CreateMap<Source, DestinationDerived>()
.IncludeBase<Source, DestinationBase>();
});
var src = new Source() { A = 1, Str = "foo" };
var dest = new DestinationBase();
Mapper.Map(src, dest);
Однако после обновления до 4.0.4 это отображение выдает исключение:
System.InvalidCastException: Unable to cast object of type 'DestinationBase' to type 'DestinationDerived'
Что-то я делаю не так или это ошибка в AutoMapper?
Код в.net fiddle:
- 3.3.1 версия: https://dotnetfiddle.net/6K9PtK
- Версия 4.0.4: https://dotnetfiddle.net/0mF8y8
1 ответ
Решение
Похоже, что в 4.x вам больше не нужно явно включать базу. Следующее работает просто отлично и выводит a
как 1, как и ожидалось.
Mapper.Initialize(cfg => {
cfg.CreateMap<Source, DestinationBase>();
cfg.CreateMap<Source, DestinationDerived>();
});
var src = new Source() { a = 1, str = "foo" };
var dest = new DestinationBase();
Mapper.Map(src, dest);
Console.WriteLine("dest.a: " + dest.a);
Аналогично, отображение на DestinationDerived
также правильно отображает свойства, унаследованные от базы:
var src = new Source() { a = 1, str = "foo" };
var dest = new DestinationDerived();
Mapper.Map(src, dest);
Console.WriteLine("dest.a: " + dest.a);