【问题标题】:Mapping same object type properties in a class invokes Equals and GetHashCode在类中映射相同的对象类型属性调用等于和gethashcode
【发布时间】:2016-09-23 11:45:23
【问题描述】:

我有这门课。

public class ConflictItem<T> where T : new()
    {
        public T CurrentItem { get; set; }
        public T RequestedUpdateItem { get; set; }
    }

其中 T 实现 bool Equals(object obj)int GetHashCode()IEquatable&lt;SyncObject&gt;

假设您有IEnumerable&lt;ConflictItem&lt;Order&gt;&gt; 并映射到IEnumerable&lt;ConflictItem&lt;OrderDataObject&gt;&gt;,这将调用Equals 和GetHashCode,我不明白原因。

问题是映射的结果对象ConflictItem&lt;OrderDataObject&gt; 最终在 CurrentItem 和 RequestedUpdateItem 属性中具有相同的对象实例。

我的简单 Automapper 配置。

config.CreateMap<ConflictItem<Order>, ConflictItem<OrderDataObject>>().ReverseMap();
config.CreateMap<Order, OrderDataObject>().ReverseMap();

我了解列表中或两个对象之间的对象相等性,但为什么 Automapper 会匹配另一个对象中两个不同属性的相等性?有没有办法通过配置覆盖这种行为?

【问题讨论】:

  • 这不只是底层集合本身吗?
  • 我用问题更新了问题,我最终收到一个 ConflictItem 在两个属性中具有相同的对象实例。
  • 如何调用Equals 导致这两个属性发生变化?我怀疑你实际上有一个糟糕的映射配置。您能否展示您的映射方式以及您在哪里看到Equals 被调用?
  • 我知道这太奇怪了,我也无法解释,但我通过在类中的 Equals overiden 实现中设置断点进行了验证。添加配置。
  • stackoverflow.com/questions/21612176/… 这是同一个问题。也许在这里:stackoverflow.com/questions/11333732/… 可怕的行为。投票最多的解决方案也很糟糕。

标签: c# automapper


【解决方案1】:

似乎库已经添加了一个选项来禁用缓存作为 Map 方法的一个选项:

var output = Mapper.Map<T1, T2>(input, opt => opt.DisableCache = true);

尝试一下,看看它是否能解决您的问题。

我一直在查看 GitHub 上的 5.0 Beta 版本,看来他们可能会默认禁用此缓存:

https://github.com/AutoMapper/AutoMapper/releases/tag/v5.0.0-beta-1

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-04-04
  • 2021-04-19
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
相关资源
最近更新 更多