Как использовать 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()

Другие вопросы по тегам