Как использовать Object.GetHashCode() для типа, который переопределяет GetHashCode ()
У меня есть класс A, который реализует IEquatable<>, используя его поля (скажем, Ab и Ac) для реализации / переопределения Equals() и переопределения GetHashCode(), и все работает отлично, 99% времени. Класс A является частью иерархии (класс B, C), которая все наследуется от интерфейса D; все они могут храниться вместе в словаре Dictionary, поэтому удобно, когда все они несут свои собственные Equals()/GetHashCode() по умолчанию.
Однако при создании ИИ иногда нужно проделать определенную работу, чтобы получить значения для Ab и Ac; пока это происходит, я хочу сохранить ссылку на экземпляр, который создается. В этом случае я не хочу использовать переопределения Equals()/GetHashCode() по умолчанию, предоставляемые A. Таким образом, я думал о реализации ReferenceEqualityComparer, который предназначен для принудительного использования Equals()/GetHashCode() объекта.:
private class ReferenceEqualityComparer<T> : IEqualityComparer<T>
{
#region IEqualityComparer<T> Members
public bool Equals(T x, T y)
{
return System.Object.ReferenceEquals(x, y);
}
public int GetHashCode(T obj)
{
// what goes here? I want to do something like System.Object.GetHashCode(obj);
}
#endregion
}
Вопрос заключается в том, что, поскольку A переопределяет Object.GetHashCode(), как я могу (за пределами A) вызвать Object.GetHashCode () для экземпляра A?
Одним из способов, конечно, было бы для А не реализовывать IEquatable<> и всегда предоставлять IEqualityComparer<> для любого словаря, который я создаю, но я надеюсь на другой ответ.
Спасибо
2 ответа
Естественное совпадение для object.ReferenceEquals
является RuntimeHelpers.GetHashCode
,
Смотрите ответ на этот вопрос для более подробной информации и реализации ObjectReferenceEqualityComparer<T>
: Встроенный IEqualityComparer<T>
который использует ReferenceEquals
Вызвать базовую реализацию CLR через interop: реализация по умолчанию для Object.GetHashCode()