Domanda

Ho una classe che implementa un IEquatable <>, con i suoi campi (diciamo, a.b e A.c) per l'attuazione / sovrascrivendo Equals () e GetHashCode prioritario (), e tutto funziona bene, il 99% del tempo. Classe A è parte di una gerarchia (classe B, C) che tutti ereditano dall'interfaccia D; tutti possono essere memorizzati insieme in un dizionario dizionario, quindi è conveniente quando tutti portano le proprie Equals di default () / GetHashCode ().

Tuttavia, mentre la costruzione di una volta o l'altra ho bisogno di fare un certo lavoro per ottenere i valori per a.b e A.c; mentre quello che sta succedendo, voglio memorizzare un riferimento all'istanza che è in fase di costruzione. In tal caso, non voglio usare le Equals di default () / GetHashCode () override forniti da A. Così, stavo pensando di attuare un ReferenceEqualityComparer, che è destinata a forzare l'uso di Equals () dell'oggetto / 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 domanda è, dal momento che la priorità A Object.GetHashCode (), come posso (al di fuori di A) chiamare Object.GetHashCode () per un'istanza di A?

Un modo, naturalmente, sarebbe per una di non implementare IEquatable <> e sempre fornire un'IEqualityComparer <> a qualsiasi dizionario che creo, ma sto sperando in una risposta diversa.

Grazie

È stato utile?

Soluzione

La partita naturale per object.ReferenceEquals è RuntimeHelpers.GetHashCode .

Vedere la risposta a questa domanda per i dettagli e l'implementazione di ObjectReferenceEqualityComparer<T>: Built in IEqualityComparer<T> che utilizza ReferenceEquals

Altri suggerimenti

Chiama implementazione di base del CLR via di interoperabilità: predefinito implementazione per Object.GetHashCode ()

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top