c# - AutoMapper:映射 ImmutableHashSet 的问题

标签 c# automapper automapper-9

我正在尝试 MapReverseMap ImmutableHashSet属性为 ICollection使用 AutoMapper .

Automapper 成功映射 ImmutableHashSet属性(property)到ICollection但它无法映射 ICollection返回 ImmutableHashSet
这是最小的可重现示例:

考虑我有 OrderOrderItem类如下:

public class Order
{
    private HashSet<OrderItem> _orderItems;

    public Order()
    {
        _orderItems = new HashSet<OrderItem>();
    }

    public ImmutableHashSet<OrderItem> OrderItems
    {
        get => _orderItems.ToImmutableHashSet();
        private set => _orderItems = value.ToHashSet();
    }

    public void AddOrderItem(OrderItem orderItem)
    {
        _orderItems.Add(orderItem);
    }

    public void RemoveOrderItem(OrderItem orderItem)
    {
        _orderItems.Add(orderItem);
    }
}

public class OrderItem
{
    public OrderItem(int orderId, string orderName)
    {
        OrderId = orderId;
        OrderName = orderName;
    }

    public int OrderId { get; private set; }


    public string OrderName { get; private set; }
}
OrderOrderItem类需要映射到以下 OrderDto和类(class)
public class OrderDto
{
    public ICollection<OrderItem> OrderItems { get; set; }
}

public class OrderItemDto
{

    public int OrderId { get; set; }


    public string OrderName { get; set; }
}
OrderProfile下面的类定义了要映射的 Automapper 配置文件 OrderOrderDto反之亦然。
public class OrderProfile : Profile
{
    public OrderProfile()
    {
        CreateMap<Order, OrderDto>()
            .ReverseMap();
        CreateMap<OrderItem, OrderItemDto>()
            .ReverseMap();
    }
}

public class OrderItemDto
{

    public int OrderId { get; set; }


    public string OrderName { get; set; }
}

用于映射和反向映射的代码 OrderOrderDto类:
private static void Map()
{
    var mapper = new MapperConfiguration(cfg =>
    {
        cfg.AddProfile(new OrderProfile());
    }).CreateMapper();

    var order = new Order();
    order.AddOrderItem(new OrderItem(1, "Laptop"));
    order.AddOrderItem(new OrderItem(2, "Keyboard"));

    // This code maps correctly
    var orderDto = mapper.Map<OrderDto>(order);

    // This is where I get an exception
    var orderMappedBack = mapper.Map<Order>(orderDto);
}

关于映射 Order object来自 OrderDto ,我得到以下异常:

System.ArgumentException: System.Collections.Immutable.ImmutableHashSet`1[ReadOnlyCollectionDemo.OrderItem]
needs to have a constructor with 0 args or only optional args.
(Parameter 'type') at lambda_method(Closure , OrderDto , Order , ResolutionContext )


任何帮助解决此问题的指针都非常感谢。

更新

我以某种方式让它通过自定义工作 Converter .但我真的不知道它是如何工作的。我更新了我的映射器配置如下:
 var mapper = new MapperConfiguration(cfg =>
        {
            cfg.AddProfile(new OrderProfile());
            cfg.CreateMap(typeof(ICollection<>), typeof(ImmutableHashSet<>)).ConvertUsing(typeof(HashMapConverter<,>));
        }).CreateMapper();

我的 HashMapConverter类(class):
public class HashMapConverter<TCollection, TImmutableHashSet> 
        : ITypeConverter<ICollection<TCollection>, ImmutableHashSet< TImmutableHashSet>>
    {
        public ImmutableHashSet< TImmutableHashSet> Convert(
            ICollection<TCollection> source,
            ImmutableHashSet< TImmutableHashSet> destination,
            ResolutionContext context)
        {
            return ImmutableHashSet<TImmutableHashSet>.Empty;
        }
    }

正如你所看到的,我只是返回一个空的 ImmutableHashSet然而,令我惊讶的是 OrderDto现在已成功映射回 Order正确的编号是 OrderItems Count .我本来以为 Count为 0,因为我返回一个空 HashSet .我怀疑它是有效的,因为 OrderItemOrderItemDto也通过 AutoMapper 映射.

我想确认我的假设并知道这是否是正确的方法。

最佳答案

在我的类似示例中,我没有得到预期值,而是一个空集合,因此您最好使用

public class HashMapConverter<TCollection, TImmutableHashSet>
: ITypeConverter<ICollection<TCollection>, ImmutableHashSet<TImmutableHashSet>>
{
    public ImmutableHashSet<TImmutableHashSet> Convert(
        ICollection<TCollection> source,
        ImmutableHashSet<TImmutableHashSet> destination,
        ResolutionContext context)
    {
        var hs =new HashSet<TCollection>(source);
        return ((IEnumerable<TImmutableHashSet>)hs).ToImmutableHashSet<TImmutableHashSet>();
        //return ImmutableHashSet<TImmutableHashSet>.Empty;
    }
}

而不是返回空;

关于c# - AutoMapper:映射 ImmutableHashSet 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61537755/

相关文章:

Automapper 将 DataTable 映射到 POCO 列表

c# - Automapper 自定义解析器源成员到目标对象列表映射问题

c# - 更高效的数据库访问

c# - 如何连接两个异常?

c# - AutoMapper 和继承 - 如何映射?

c# - Automapper自定义多对一转换

c# - AutoMapper - 从 v8 升级到 v9 后不使用泛型

c# - AutoMapper 版本 9.0.0 - IMappingOperationOptions 上没有 ConfigureMap() 方法

c# - 在 C# 中使用鼠标点绘制多边形

c# - 在Python中动态进行多处理