Новая версия 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:

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);
Другие вопросы по тегам