【发布时间】:2009-04-08 20:02:43
【问题描述】:
我在一个抽象基类中重写了 Equals 和 GetHashCode 以实现基于对象的键属性的值相等。我的主要目的是能够在集合上使用 Contains 方法而不是 Find 或 FirstOrDefault 来检查实例是否已添加到集合中。
public abstract class Entity
{
public abstract Guid Id { get; }
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
if (obj.GetType() != GetType())
{
return false;
}
var entity = (Entity)obj;
return (entity.Id == Id);
}
public override int GetHashCode()
{
return Id.GetHashCode();
}
}
这种方法的问题是我的所有对象在它们被持久化并获得一个 Id(由 NHibernate 生成)之前都是相等的。我做错了吗?我可以在构造函数中生成 Id,但我想为其他使用 int id 的项目实现相同的模式,所以这显然行不通。
在我看来,任何覆盖 Equals 的对象都将在对象被实例化后立即等于同一对象的任何其他实例。
编辑添加: 以下是我关心的场景:在我的集合的 Add 方法中,我正在检查以确保集合尚未包含要添加的对象。如果所有新添加的对象都相等,那么我永远无法将两个新对象添加到集合中。
【问题讨论】:
标签: c# .net oop domain-driven-design