如何在重写GetHashCode的使用类型的Object.GetHashCode()()
-
22-09-2019 - |
题
我有一个A类实现IEquatable <>,利用其字段(比如,A·B和A.C)用于实现/重写equals()和重写GetHashCode()方法,和一切正常,的99%的时间。类是一层级(类B,C)的一部分,从接口d所有继承;它们都可以被一起存储在一个词典,因此它的方便,当他们所有携带自己的缺省的equals()/ GetHashCode()方法
不过,虽然构建我有时也需要做一些工作,得到A·B和交流转换器的值;而这是发生,我想存储向被正在兴建的实例的引用。在这种情况下,我不希望使用默认的equals()/ GetHashCode()方法由A.因此,我想实现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(),I(A外)如何可以调用Object.GetHashCode()为A的实例?
当然的一种方式将是一个不实现IEquatable <>始终提供一个的IEqualityComparer <>给我创造的任何解释,但我希望有一个不同的答案。
由于
解决方案
有object.ReferenceEquals
天然匹配是 RuntimeHelpers.GetHashCode
查看回答这个问题的全部细节和ObjectReferenceEqualityComparer<T>
的实现:内置在IEqualityComparer<T>
使用ReferenceEquals
其他提示
经由互操作调用CLR的基实现:默认实现为Object.GetHashCode()一>
不隶属于 StackOverflow