Как использовать object.gethashcode () на типе, который переопределяет gethashcode ()

StackOverflow https://stackoverflow.com/questions/2123888

Вопрос

У меня есть класс A, который реализует iequatable <>, используя его поля (скажем, AB и AC) для реализации/переоценки equals () и переоценки gethashcode (), и все работает нормально, 99% случаев. Класс A является частью иерархии (класс B, C), которая наследуется от интерфейса D; Все они могут храниться вместе в словаре словаря, поэтому это удобно, когда все они несут свои собственные по умолчанию equals ()/gethashcode ().

Тем не менее, в то время как построение ИИ когда -то нужно сделать некоторую работу, чтобы получить значения для AB и AC; Пока это происходит, я хочу сохранить ссылку на созданный экземпляр. В этом случае я не хочу использовать переоценки по умолчанию equals ()/gethashcode (), предоставленные A. Таким образом, я думал о реализации рефлексионного equitycomprer, который предназначен для применения использования объекта 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
    }

Вопрос в том, что, поскольку object.gethashcode () переопределяет object.gethashcode (), как я (за пределами a) вызовать object.gethashcode () для экземпляра a?

Конечно, одним из способов было бы не внедрить iEquatable <> и всегда предоставить iequalityComparer <> любой словарь, который я создаю, но я надеюсь на другой ответ.

Спасибо

Это было полезно?

Решение

Естественный матч для object.ReferenceEquals является RuntimeHelpers.GetHashCode.

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

Другие советы

Вызовите базовую реализацию CLR через Interop: Реализация по умолчанию для object.gethashcode ()

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top