Как я могу использовать AutoMapper для отображения нескольких подклассов в один класс? - PullRequest
12 голосов
/ 22 декабря 2010

Давайте предположим, что у меня есть три класса, которые являются подклассами базового класса:

public class BaseClass
{
    public string BaseName { get; set; }
}

public class Subclass1 : BaseClass
{
    public string SubName1 { get; set; }
}

public class Subclass2 : BaseClass
{
    public string SubName2 { get; set; }
}

public class Subclass3 : BaseClass
{
    public string SubName3 { get; set; }
}

Я хотел бы сопоставить их с классом ViewModel, который выглядит следующим образом:

public class ViewModel
{
    public string BaseName { get; set; }
    public string SubName1 { get; set; }
    public string SubName2 { get; set; }
    public string SubName3 { get; set; }
}

ViewModel просто объединяет свойства всех подклассов и выравнивает их.Я попытался настроить сопоставление следующим образом:

AutoMapper.CreateMap<BaseClass, ViewModel>();

Затем я попытался получить данные из моей базы данных следующим образом:

var items = Repo.GetAll<BaseClass>();
AutoMapper.Map(items, new List<ViewModel>());

Однако в итоге получается, что только BaseName свойство будет заполнено в ViewModel.Как настроить AutoMapper так, чтобы он также отображал свойства в подклассах?

Ответы [ 2 ]

13 голосов
/ 23 декабря 2010

Кажется, что в AutoMapper есть ошибка или ограничение, что вам нужны соответствующие иерархии TSource и TDestination. Дано:

public class BaseClass {
    public string BaseName { get; set; }
}

public class Subclass1 : BaseClass {
    public string SubName1 { get; set; }
}

Вам нужны следующие модели:

public class ViewModel {
    public string BaseName { get; set; }
}
public class ViewModel1 : ViewModel {
    public string SubName1 { get; set; }
}

Затем работает следующий код:

 Mapper.CreateMap<BaseClass, ViewModel>()
       .Include<Subclass1, ViewModel1>();
 Mapper.CreateMap<Subclass1, ViewModel1>();

 var items = new List<BaseClass> {new Subclass1 {BaseName = "Base", SubName1 = "Sub1"}};
 var viewModels = Mapper.Map(items, new List<ViewModel>());
1 голос
/ 22 декабря 2010

Попробуйте это:

AutoMapper.CreateMap<BaseClass, ViewModel>()
  .Include<Subclass1, ViewModel>()
  .Include<Subclass2, ViewModel>()
  .Include<Subclass3, ViewModel>();
AutoMapper.CreateMap<Subclass1, ViewModel>();
AutoMapper.CreateMap<Subclass2, ViewModel>();
AutoMapper.CreateMap<Subclass3, ViewModel>();

var items = Repo.GetAll<BaseClass>();
AutoMapper.Map(items, new List<ViewModel>());
...