Comment utiliser Object.GetHashCode () sur un type qui remplace GetHashCode ()
-
22-09-2019 - |
Question
J'ai une classe A qui implémente IEquatable <>, en utilisant ses champs (par exemple, A.b et A.c) pour la mise en œuvre / remplaçant equals () et GetHashCode primordial (), et tout fonctionne bien, 99% du temps. Classe A fait partie d'une hiérarchie (classe B, C) que tous héritent de l'interface D; ils peuvent tous être stockés ensemble dans un dictionnaire dictionnaire, donc il est pratique quand ils portent tous leurs propres Equals par défaut () / GetHashCode ().
Cependant, alors que la construction d'un je besoin parfois de faire un travail pour obtenir les valeurs pour A.b et A.c; tout ce qui se passe, je veux stocker une référence à l'instance qui est en cours de construction. Dans ce cas, je ne veux pas utiliser les Equals par défaut () / GetHashCode () overrides, fournie par A. Ainsi, je pensais à mettre en œuvre un ReferenceEqualityComparer, qui est destiné à forcer l'utilisation des Égaux de l'objet () / 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 question est, puisque A l'emporte sur Object.GetHashCode (), comment puis-je (hors A) appeler Object.GetHashCode () pour une instance de A?
Une façon serait bien sûr A ne pas mettre en œuvre IEquatable <> et toujours fournir un IEqualityComparer <> à un dictionnaire que je crée, mais je suis l'espoir d'une réponse différente.
Merci
La solution
Le match est naturel pour object.ReferenceEquals
RuntimeHelpers.GetHashCode
.
Voir la réponse à cette question pour plus de détails et une implémentation de ObjectReferenceEqualityComparer<T>
: Built dans IEqualityComparer<T>
qui utilise ReferenceEquals
Autres conseils
Appel de mise en œuvre de base du CLR via Interop: par défaut pour la mise en œuvre Object.GetHashCode ()