C#中包含子類集合的類的Equals方法重寫

最近的項目中,對於單元測試,我們使用NMock來模擬測試方法中依賴的方法的行爲。我們在定義模擬方法的參數值和返回值時遇到了問題。當參數或返回值爲一個對象時,我們必須重寫它的Equals方法來使模擬值與實際的值匹配。

因此我會爲每個實體類重寫Equals和GetHashCode方法。

我們有這樣一個類:

public class ShippingRequest
{
    IEnumerable<string> ResourceIds;
    string Receiver;
    string Comment;
}

它的Equals方法中會對ResourceIds、Receiver和Comment的值作比較,如果全部相同則返回true。

ResourceIds實際上是我們需要郵寄的一組設備的Id號,因此我們並不在意它們的順序,只要兩個對象中包含了一組同樣的Id號即可確定它們的ResourceIds是相等的。

怎麼對集合類型的ResourceIds作比較呢?

自然我們可以對集合中的元素做一一比較查看兩組集合中是不是包含了相同的元素。

但是如果使用LINQ,我們可以用非常簡單的方式。

list2.Except(list1);//返回在list2中但不在list1中的元素

因此我們可以將ShippingRequest類的Equals方法寫成這樣:

public override bool Equals(object o)
{
    if (o == null || !this.GetType().Equals(o.GetType()))
    {
        return false;
    }
    if(this == o)
    {
        return true;
    }
    var shippingRequest = o as ShippingRequest ;
    if(this.ResourceIds.Except(shippingRequest.ResourceIds).Count()==0 &&
        shippingRequest.ResourceIds.Except(this.ResourceIds).Count()==0 &&
        this.Receiver.Equals(shippingRequest .Receiver) &&
        this.Comment.Equals(shippingRequest .Comment))
    {
        return true;
    }
    return false;
}

然後我們只需重寫ShippingRequest類的GetHashCode方法就完成了整個類。

這裏所說的集合類型可以是IEnumerable,或者實現它的任意集合類。而集合中的類型也可以是任意類型,當然如果是自定義的類,我們首先需要正確的重寫該自定義類的Equals方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章