Come utilizzare Object.GetHashCode () su un tipo che sostituisce GetHashCode ()
-
22-09-2019 - |
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
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 ()