作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试 Map
和 ReverseMap
ImmutableHashSet
属性为 ICollection
使用 AutoMapper
.
Automapper 成功映射 ImmutableHashSet
属性(property)到ICollection
但它无法映射 ICollection
返回 ImmutableHashSet
这是最小的可重现示例:
考虑我有 Order
和 OrderItem
类如下:
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; }
}
Order
和
OrderItem
类需要映射到以下
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 配置文件
Order
至
OrderDto
反之亦然。
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; }
}
Order
和
OrderDto
类:
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
.我怀疑它是有效的,因为
OrderItem
和
OrderItemDto
也通过
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/
我正在尝试 Map和 ReverseMap ImmutableHashSet属性为 ICollection使用 AutoMapper . Automapper 成功映射 ImmutableHashSe
我有一个基本项列表(准确地说是来自 System.Collections.Immutable 的 ImmutableHashSet)并尝试调用以下代码 _baseList.Contains(deriv
我是一名优秀的程序员,十分优秀!