2013-02-13 56 views
1

我有一个死了INotifyPropertyChanged继承的简单视图模型。试图为这个视图模型创建一些自动化测试后,我最终覆盖了Equals()GetHashCode()。我的测试通过了,所以我是一个快乐的露营者。为什么重写GetHashCode()块INotifyPropertyChanged?

但是,现在我的Windows窗体数据绑定没有反应,当我的视图模型中的属性发生更改时。如果我评论我的GetHashCode()实现所有预期的工作,除了我的测试。

这是我实现:

public override int GetHashCode() 
{ 
    unchecked 
    { 
     var hashCode = (_subject != null ? _subject.GetHashCode() : 0); 
     hashCode = (hashCode * 397)^(_message != null ? _message.GetHashCode() : 0); 
     hashCode = (hashCode * 397)^
        (_body != null ? _body.GetHashCode() : 0); 
     return hashCode; 
    } 
} 

这简直是对我产生什么ReSharper的。

为什么重写GetHashCode()会阻止我的数据绑定拾取我的视图模型更改,尽管我调用了PropertyChanged事件?

+0

GetHashCode()和Equals()是否在相同的字段上运行?换句话说,如果Equals()返回true,那么HashCodes应该是相等的。你能证实情况吗? – 2013-02-13 18:59:37

+0

我的猜测是被返回的哈希码每次都是相同的,所以.Net认为它是相同的对象,并且不会触发属性更改的事件。 – 2013-02-13 19:01:06

+1

非常不清楚。什么数据绑定?用于WinForms的ViewModels?为什么测试需要GetHashcode? – 2013-02-13 19:03:49

回答

1

我总是尽量避免将代码添加到仅用于测试目的的生产代码中。因此,由于您为了测试目的而实施了EqualsGetHashCode,是否可以实现IEqualityComparer<T>并在您的单元测试中使用它来执行断言。

+0

再次感谢。非常好的提示。 – gcso 2013-02-13 19:30:30