Немного сложно получить его с нуля, но это возможно. Вы должны создать ITypeConverter<,>
и применить его для преобразования.
Имейте в виду, что метод ConvertUsing()
также имеет перегрузку для простого добавления встроенной функции, но вам нужно иметь доступ к самому преобразователю, чтобы вызвать его для сопоставления внутренних объектов с желаемыми объектами результата, и это доступно только с интерфейсом преобразователя типов.
public class OrderMappingProfile : Profile
{
public OrderMappingProfile()
{
CreateMap<OrderDto, Order>();
CreateMap<OrderDtoList, List<Order>>().ConvertUsing<CustomConverter>();
}
}
public class CustomConverter : ITypeConverter<OrderDtoList, List<Order>>
{
public List<Order> Convert(OrderDtoList source, List<Order> destination, ResolutionContext context)
{
return context.Mapper.Map<List<Order>>(source.Orders);
}
}
Имея это в наличии, вы можете создать нужный список прямо из DTO:
public static class Program
{
public static void Main()
{
var config = new MapperConfiguration(cfg => cfg.AddProfile<OrderMappingProfile>());
var mapper = config.CreateMapper();
var orderList = new OrderDtoList { Orders = Enumerable.Range(1, 10).Select(i => new OrderDto { Id = i }).ToArray() };
var orders = mapper.Map<List<Order>>(orderList);
}
}
Как упоминал Люциан, существует перегрузка ConvertUsing()
, которая обеспечивает контекст. Таким образом, вы можете также добавить это вместо использования собственного класса:
// Use lambda method
CreateMap<OrderDtoList, List<Order>>()
.ConvertUsing((source, _, context) => context.Mapper.Map<List<Order>>(source.Orders));
// Use static method
CreateMap<OrderDtoList, List<Order>>().ConvertUsing(ListConverter);
private static List<Order> ListConverter(OrderDtoList source, List<Order> destination, ResolutionContext context)
{
return context.Mapper.Map<List<Order>>(source.Orders);
}