Как использовать object.gethashcode () на типе, который переопределяет gethashcode ()
-
22-09-2019 - |
Вопрос
У меня есть класс 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 ()