Я переопределил 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 ids, так что это, очевидно, не будет работать.
Мне кажется, что любой объект, который переопределяет Equals, будет равен любому другому экземпляру того же объекта сразу после того, как объекты были созданы.
Отредактировано, чтобы добавить:
Вот сценарий, который меня интересует: В методе Add для моих коллекций я проверяю, чтобы убедиться, что коллекция еще не содержит объект, который нужно добавить. Если все новые объекты равны, то я никогда не смогу добавить два новых объекта в коллекцию.