Я думаю, что ваш лучший вариант здесь - это определить TypeConverter
.
Вы можете сделать TypeConverters встроенными, как я сделал ниже, или вы можете определить класс, который реализует интерфейс ITypeConverter<TIn, TOut>
.
cfb.CreateMap<SourceParent, List<Destination>>().ConvertUsing((src, dest, context) =>
{
return src.Childs.Select(x =>
{
var destination = context.mapper.Map<Destination>(x);
destination.SourceParentId = src.Id;
return destination;
}
});
Если вы хотите (я обычно держусь подальше от этого, потому что это может стать слишком быстрым), вы можете определить другое пользовательское отображение, используя кортеж или класс-обертку, как этот.
cfb.CreateMap<SourceParent, List<Destination>>().ConvertUsing((src, dest, context) =>
{
return src.Childs.Select(x => context.mapper.Map<Destination>((src.Id, x)))
});
cfb.CreateMap<(int partentId, SourceChild child), Destination>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.parentId))
.ForMember(dest => dest.ChildId, opt => opt.MapFrom(src => src.child.Id))
.ForMember(dest => dest.OtherProperty , opt => opt.MapFrom(src => src.child.OtherProperty ));
Это может быть полезно для небольших примеров, но если вы делаете это часто, это может привести к действительно беспорядочным конфигурациям картографирования (на мой взгляд), но это действительно упрощает ваш конвертер типов.