Как использовать Object.GetHashCode () для типа, который переопределяет GetHashCode () - PullRequest
4 голосов
/ 23 января 2010

У меня есть класс A, который реализует IEquatable <>, используя его поля (скажем, A.b и A.c) для реализации / переопределения Equals () и переопределения GetHashCode (), и все работает отлично, 99% времени. Класс A является частью иерархии (класс B, C), которая все наследуется от интерфейса D; все они могут храниться вместе в словаре Dictionary, поэтому удобно, когда все они несут свои собственные Equals () / GetHashCode () по умолчанию.

Однако, при построении A мне иногда нужно проделать определенную работу, чтобы получить значения для A.b и A.c; пока это происходит, я хочу сохранить ссылку на экземпляр, который создается. В этом случае я не хочу использовать переопределения 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 ]

7 голосов
/ 29 марта 2010

Естественное совпадение для object.ReferenceEquals равно RuntimeHelpers.GetHashCode.

См. Ответ на этот вопрос для получения полной информации и реализации ObjectReferenceEqualityComparer<T>: Встроенный IEqualityComparer<T>, который использует ReferenceEquals

0 голосов
/ 29 марта 2010

Вызовите базовую реализацию CLR с помощью взаимодействия: Реализация по умолчанию для Object.GetHashCode ()

...