使用 AutoMapper CreateMap 将 属性 映射到对象列表

Map a property to list of object using AutoMapper CreateMap

首先,对不起我的英语:)

我正在使用 AutoMapper 在 类 之间进行映射。

我有如下 类 的结构。

public class OrderDto {
  int Id { get; set; }
}

public class OrderDtoList {
  OrderDto[] Orders { get; set; }
}

public class Order {
  int Id { get; set; }
}

我的问题是,我想使用 AutoMapping 配置文件将 OrderDtoList 对象映射到 List。

public class OrderMappingProfile : Profile {
  public OrderMappingProfile() {
    CreateMap<OrderDto, Order>();
    CreateMap<OrderDtoList, List<Order>(); // <<<<<<<< I cannot figure out this.
  }
}

但我不知道如何编写 CreateMap<>() 函数。

请帮忙。

下面是通用的 extension,如果您之前没有使用过扩展,请注意 GenericExtensions class 是静态的 class

public static class GenericExtensions {
   public static object Map<T>(this T source)
    {
        var fullName = source.GetType().FullName;
        var sourceType = source.GetType();


        var baseType = ObjectContext.GetObjectType(source.GetType());

        var config = new MapperConfiguration(cfg =>
            cfg.CreateMap(sourceType, baseType));




        var mapper = config.CreateMapper();

        var entity = mapper.Map(source, sourceType, baseType);

        return entity;

    }

}

public static List<T> Map<T>(this List<T> original)
{
        var config = new MapperConfiguration(cfg =>
            cfg.CreateMap(typeof(T), typeof(T)));

        var mapper = config.CreateMapper();       
        return original.Select(mapper.Map<T, T>).ToList();
}

用法:

对于单个实体:

var originalObject = new  Order();
originalObject.Id = 4; 
var clonedObject = originalObject.Map();

对于实体列表:

var objectList = db.ORDERS.ToList();
var clonedList = objectList.Map();

希望对您有所帮助!

从头开始有点困难,但这是可能的。您必须创建一个 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);
    }
}

正如 Lucian 提到的,ConvertUsing() 的重载提供了上下文。所以你也可以内联这个,而不是使用自己的 class:

// 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);
}

您可以创建一个 class 实现 ITypeConverter< OrderDtoList, List > 并使用 ConvertUsing 方法创建映射。

public class OrderDtoListMapper : ITypeConverter<OrderDtoList, List<Order>>
{
    public List<Order> Convert(OrderDtoList source, List<Order> destination, ResolutionContext context)
    {
        return context.Mapper.Map<List<Order>>(source.Orders);
    }
}

然后,您可以像这样创建映射:

public class MapperProfile : Profile
{
    public MapperProfile()
    {
        CreateMap<OrderDto, Order>();
        CreateMap<OrderDtoList, List<Order>>().ConvertUsing<OrderDtoListMapper>();
    }
}

希望这就是您要找的!