Можно ли создать коллекцию на Dest на основе коллекции в источнике? - PullRequest
0 голосов
/ 20 декабря 2018

Скажем, у меня есть

public class A 
{ 
  public List<int> Ids {get;set;}
}
public class B 
{ 
   public List<Category> Categories {get;set;}
}
public class Category 
{ 
   public string Name {get;set;} //will be blank on map
   public int CategoryId {get;set;}
}

var source = new A {...};

var b  = mapper.Map<A, B>(source);

, поэтому при сопоставлении он фактически создаст новую коллекцию на dest, но сопоставит идентификаторы на основе того, что находится в исходной коллекции, других свойств destбудет пустым, потому что нет ничего для сопоставления.

Как настроить конфигурацию для этого сопоставления?

1 Ответ

0 голосов
/ 20 декабря 2018

Вам нужна комбинация ForMember, MapFrom и ForAllOtherMembers:

Mapper.Initialize(cfg =>
                  {
                      cfg.CreateMap<A, B>()
                         .ForMember(dest => dest.Categories, opt => opt.MapFrom(src => src.Ids));

                      cfg.CreateMap<int, Category>()
                         .ForMember(dest => dest.CategoryId, opt => opt.MapFrom(src => src))
                         .ForAllOtherMembers(opt => opt.Ignore());
                  });

MapFrom, что позволит вам переопределить сопоставление по умолчанию по имени, которое обычно делает AM.Как вы можете видеть в строке 4, мы можем сказать, что Ids в исходном коде соответствует Categories в классе назначения.

Но теперь вам нужно переопределить способ отображения int, так какэто тип вещи в IdsMapFrom вам не нужно (обязательно) предоставлять свойство для источника - весь источник может быть отображаемым объектом.Таким образом, в строке 7 мы сопоставляем int s, полученные из сопоставления в строке 4, и говорим, что они должны отображаться в свойство класса назначения * CategoryId.Наконец, мы просто говорим AM, что нам не нужно отображать какие-либо оставшиеся свойства в целевом классе, указав параметр ForAllOtherMembers.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...