3

我有一個實現IEquatable <>的類A,使用它的字段(比如Ab和Ac)來實現/覆蓋Equals()並重寫GetHashCode (),並且一切正常,99%的時間。類A是層次結構(類B,C)的一部分,它們都從接口D繼承;它們都可以一起存儲在詞典字典中,因此當它們全部攜帶它們自己的默認Equals()/ GetHashCode()時,它們很方便。如何在覆蓋GetHashCode()的類型上使用Object.GetHashCode()

然而,在構建A I時,有時需要做一些工作來獲得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 <>並始終爲我創建的任何字典提供IEqualityComparer <>,但我希望得到不同的答案。

感謝

+2

你自己挖一個漂亮的深洞。用IEqualityComparer <>離開它。 – 2010-01-23 17:13:02

回答

-1

通過電話互操作CLR的基本實現:Default implementation for Object.GetHashCode()

+0

該鏈接對於學術目的很有意思,但您應該使用'RuntimeHelpers.GetHashCode()'來代替。 – 2010-03-29 03:25:33

+0

沒錯,不知道那個。它只是調用完全相同的底層互操作方法,所以沒有功能差異(但是:是的,你應該使用已發佈的API,以防它發生變化等) – piers7 2010-03-30 02:40:50