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