如何在重写GetHashCode()的类型上使用Object.GetHashCode()

时间:2010-01-23 16:56:40

标签: c# gethashcode iequatable iequalitycomparer referenceequals

我有一个实现IEquatable<>的类A,使用它的字段(例如,A.b和A.c)来实现/覆盖Equals()并覆盖GetHashCode(),一切正常,99%的时间。 A类是层次结构(B类,C类)的一部分,它们都从接口D继承;它们都可以存储在字典词典中,因此当它们都带有自己的默认Equals()/ GetHashCode()时很方便。

然而,在构建A时,有时需要做一些工作来获取A.b和A.c的值;当发生这种情况时,我想存储对正在构建的实例的引用。在这种情况下,我不想使用A提供的默认Equals()/ GetHashCode()覆盖。因此,我正在考虑实现一个ReferenceEqualityComparer,这意味着强制使用Object的Equals()/ 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
    }

问题是,由于A重写了Object.GetHashCode(),我如何(在A之外)调用Object.GetHashCode()作为A的实例?

当然,一种方法是A不实现IEquatable&lt;&gt;并始终提供IEqualityComparer&lt;&gt;我创建的任何字典,但我希望得到不同的答案。

由于

2 个答案:

答案 0 :(得分:7)

object.ReferenceEquals的自然匹配是RuntimeHelpers.GetHashCode

有关ObjectReferenceEqualityComparer<T>的详细信息和实施情况,请参阅此问题的答案:Built-in IEqualityComparer<T> that uses ReferenceEquals

答案 1 :(得分:-1)

通过互操作:Default implementation for Object.GetHashCode()

调用CLR的基本实现
相关问题