Поскольку между именами SourceEntity
и DestEntity
нет соглашения об именовании и сопоставления свойств отношения один к одному, у вас есть два параметра:
Использование сопоставления конструктора
Для этоговам нужно добавить конструктор к вашему DestEntity
, как показано ниже:
public DestEntity(IEnumerable<object> list1, IEnumerable<object> list2)
{
this.DestinationObjects = new List<SubDestinationEntity>();
if (list1.Any())
{
this.DestinationObjects.Add(new SubDestinationEntity
{
Title = "Some text 1",
Objects = list1
});
}
if (list2.Any())
{
this.DestinationObjects.Add(new SubDestinationEntity
{
Title = "Some text 2",
Objects = list2
});
}
}
После этого создайте свое отображение следующим образом:
cfg.CreateMap<SourceEntity, DestEntity>(MemberList.None)
.ForCtorParam("list1", opt => opt.MapFrom(src => src.List1))
.ForCtorParam("list2", opt => opt.MapFrom(src => src.List2));
Примечание: Выможете избежать использования .ForCtorParam()
, если параметры вашего конструктора соответствуют именам свойств вашего типа источника.Они нужны только тогда, когда параметры не совпадают.
Использование метода ConstructUsing
Если вы не хотите изменять класс DestEntity
, добавив новый конструктор, вы можете использовать метод ConstructUsing
как показано ниже:
cfg.CreateMap<SourceEntity, DestEntity>(MemberList.None)
.ConstructUsing(sourceItem =>
{
var destItem = new DestEntity
{
DestinationObjects = new List<SubDestinationEntity>()
};
if (sourceItem.List1.Any())
{
destItem.DestinationObjects.Add(new SubDestinationEntity
{
Title = "Some text 1",
Objects = sourceItem.List1
});
}
if (sourceItem.List2.Any())
{
destItem.DestinationObjects.Add(new SubDestinationEntity
{
Title = "Some text 2",
Objects = sourceItem.List2
});
}
return destItem;
});
Я предпочитаю использовать первую версию, в которой используется отображение constrructor, потому что я не хочу вкладывать много логики в конфигурацию отображения.