По крайней мере с последними версиями Automapper (> 2.0?) Ваш код будет в порядке, если вы удалите IList<>
: s из вашего первого CreateMap
оператора 1 .И вам не нужно создавать конкретные классы DTO, как @Simon предлагает в другом ответе (если только это не то, что вы хотите).
Но если быть точным в отношении наследования и избегать избыточных предложений отображения при расширении базового класса, вы можете указать наследование с помощью метода .Include
.Итак, если вы создаете свои сопоставления следующим образом:
Mapper.CreateMap<Base, DTO>()
.Include<ClassA, DTO>()
.Include<ClassB, DTO>()
.ForMember(dest => dest.Description, opt => opt.Ignore())
.ForMember(dest => dest.Number, opt => opt.Ignore());
Mapper.CreateMap<ClassA, DTO>()
.ForMember(dest => dest.Description, opt => opt.Ignore());
Mapper.CreateMap<ClassB, DTO>()
.ForMember(dest => dest.Number, opt => opt.Ignore());
Mapper.AssertConfigurationIsValid(); //Is OK!
, то вы можете сделать это:
var baseList = new List<Base>
{
new Base {Name = "Base"},
new ClassA {Name = "ClassA", Number = 1},
new ClassB {Name = "ClassB", Description = "Desc"},
};
var test = Mapper.Map<IList<Base>, IList<DTO>>(baseList);
Console.WriteLine(test[0].Name);
Console.WriteLine(test[1].Name);
Console.WriteLine((test[1]).Number);
Console.WriteLine(test[2].Name);
Console.WriteLine((test[2]).Description);
Console.ReadLine();
(Обратите внимание, что вам не нужно специально сопоставлять IList. Automapper обрабатывает этодля вас.)
См. эту статью о .Include
.
1 На самом деле мне интересно, скомпилирован ли код, как написано в вопросе?