Cómo utilizar Object.GetHashCode () en un tipo que anula GetHashCode ()
-
22-09-2019 - |
Pregunta
Tengo una clase que implementa una IEquatable <>, usando sus campos (por ejemplo, A.B y A.C.) para la implementación / anulando Iguales () y anulando GetHashCode (), y todo está bien, el 99% de las veces funciona. Clase A es parte de una jerarquía (clase B, C) que toda la Heredar del interfaz de D; todos ellos pueden ser almacenados juntos en un diccionario diccionario, por lo que es conveniente cuando todos ellos llevan sus propias Iguales (por defecto) / GetHashCode ().
Sin embargo, mientras que la construcción de un yo en algún momento tenga que hacer algún trabajo para obtener los valores para A.B y A.C.; mientras que está sucediendo, quiero almacenar una referencia a la instancia que se está construyendo. En ese caso, no quiero utilizar los Iguales por defecto () / GetHashCode () anulaciones proporcionados por A. Por lo tanto, yo estaba pensando en la implementación de un ReferenceEqualityComparer, que ha significado para forzar el uso de Iguales de Object () / 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
}
La pregunta es, ya que A anulaciones Object.GetHashCode (), ¿cómo puedo (fuera de A) llamar Object.GetHashCode () de una instancia de A?
Una forma, por supuesto, sería de A a no aplicar IEquatable <> y siempre suministrar una IEqualityComparer <> en cualquier diccionario que creo, pero estoy esperando una respuesta diferente.
Gracias
Solución
El partido natural para object.ReferenceEquals
es RuntimeHelpers.GetHashCode
.
Vea la respuesta a esta pregunta para los detalles completos y una implementación de ObjectReferenceEqualityComparer<T>
: Built- IEqualityComparer<T>
en que los usos ReferenceEquals
Otros consejos
Llamada implementación base del CLR a través de interoperabilidad: defecto de ejecución de Object.GetHashCode ()