2016-07-07 1 views
0

Я пытаюсь отобразить несколько типов, около 50 для других типов (50 из них), они от одного до одного, но я хочу отобразить из интерфейса в конкретный тип.Карта нескольких производных типов

Соответствующий пример кода:

using AutoMapper; 
using System; 
using System.Collections.Generic; 

namespace ConsoleApplication1 
{ 
    internal class Program 
    { 
     public interface IAnimalBO { } 
     public interface IBearBO : IAnimalBO { } 
     public interface ITigerBO : IAnimalBO { } 

     public static void Main() 
     { 
      var config = new MapperConfiguration(cfg => 
      { 
       // Base class mapping.. 
       cfg.CreateMap<IAnimalBO, AnimalVM>(); 


       cfg.CreateMap<ITigerBO, TigerVM>(); 
       cfg.CreateMap<IBearBO, BearVM>(); 
      }); 

      var mapper = config.CreateMapper(); 

      // Configure AutoMapper 

      var businessObjects = new List<IAnimalBO> 
      { 
       new TigerBO(), 
       new BearBO() 
      }; 

      var results = mapper.Map<IEnumerable<AnimalVM>>(businessObjects); 

      foreach (var result in results) 
      { 
       Console.WriteLine(result.GetType().Name); 
      } 
      Console.ReadKey(); 
     } 

     public class AnimalVM { } 
     public class BearBO : IBearBO { } 
     public class BearVM : AnimalVM { } 
     public class TigerBO : ITigerBO { } 
     public class TigerVM : AnimalVM { } 
    } 
} 

Ожидаемый результат должен быть:

TigerVM

BearVM

но фактический выход:

AnimalVM

AnimalVM

Я не уверен, как настроить automapper для отображения этих типов.

Если предаю отображение базовой линии:

   // Base class mapping.. 
       // cfg.CreateMap<IAnimalBO, AnimalVM>(); 

тогда я получаю следующее исключение:

типы отображения ошибок.

типы карт:

List'1 -> IEnumerable'1 System.Collections.Generic.List'1 [[ConsoleApplication1.Program + IAnimalBO, ConsoleApplication1, Version = 1.0.0.0, культура = нейтральной, PublicKeyToken = NULL]] -> System.Collections.Generic.IEnumerable'1 [[ConsoleApplication1.Program + AnimalVM, ConsoleApplication1, Version = 1.0.0.0, культура = нейтральной, PublicKeyToken = NULL]]

+0

Обновленный вопрос, хотя любой человек с любым опытом в этом бы понять вопрос. –

ответ

2

Вы хотите использовать включают <>, который выбирает наиболее производное отображение из класса.

Дополнительная информация на сайте Mapping Inheritance.

var config = new MapperConfiguration(cfg => 
{ 
    // Base class mapping.. 
    cfg.CreateMap<IAnimalBO, AnimalVM>() 
     .Include<ITigerBO, TigerVM>() 
     .Include<IBearBO, BearVM>(); 
    cfg.CreateMap<ITigerBO, TigerVM>(); 
    cfg.CreateMap<IBearBO, BearVM>(); 
}); 

enter image description here

+0

Ahh да, я забыл двойные сопоставления ... тьфу –