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

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top