У меня есть базовый класс «Entity» со следующим способом (я не реализующего IEquatable, это была огромная головная боль, так что я угробил этот подход)Как я могу получить класс, который принимает общий тип, для вызова метода из экземпляра этого типа?
virtual public bool Equals(Entity entity)
{
throw new Exception("The base Entity.Equals method should never be called");
}
У меня есть несколько классов, которые расширяют Entity. Каждый из них реализует метод Equals, что-то вроде этого.
virtual public bool Equals(TestPlan other)
{
if (this.TestPlanType.Equals(other.TestPlanType) &&
this.Name.Equals(other.Name) &&
this.Description.Equals(other.Description) &&
this.DatetimeCreated.Equals(other.DatetimeCreated) &&
this.UserNameCreated.Equals(other.UserNameCreated) &&
this.Duration.Equals(other.Duration) &&
this.Scenarios.SequenceEqual(other.Scenarios)) return true;
return false;
}
Я действительно хочу иметь вход типа TestPlan вместо Object. (По крайней мере, я думаю, что делаю, я не хочу терять сильную типизацию).
Я понимаю, что этот метод не «переопределяет» базовый класс, потому что я сделал его виртуальным публичным, а не public override.
У меня есть метод, который принимает обобщенный тип, который будет вызывать .equals()
public int GetIdenticalEntityId<T>(T entity) where T : Entity
{
List<T> exitingEntities = LoadEntities<T>();
foreach (T existingEntity in exitingEntities)
{
if (existingEntity.Equals(entity))
{
return existingEntity.Id;
}
}
return -1;
}
Проблема заключается в том, что exitingEntity.Equals() вызывает .equals базового класса.
Как я могу получить класс, который принимает общий тип, для вызова метода из экземпляра этого типа?
Что произойдет, если кто-то перейдет не по типу? Не будет var other = obj, поскольку TestPlan выдает исключение? Я не реализую IEquatable, мне еще нужно реализовать GetHashCode()?Каким будет преимущество реализации IEquatable, если вы сделаете это только с помощью одного метода? Этот код имеет единственную цель, чтобы проверить, совпадают ли записи базы данных при репликации. Таким образом, это не так, как мы ожидаем, что люди будут проходить объекты и сравнивать их все время. – Miebster
@ Miebster Я расширю свой ответ. Но на данный момент 'obj как TestPlan' вернет' null', если 'obj' не является' TestPlan'. –
@Miebster Вы не хотите переопределять Equals, а не GetHashCode. Некоторые из классов .Net (например, Dictionary) делают некоторые предположения с этими 2, которые вы действительно не хотите сломать. –