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

¿Fue útil?

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 ()

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top