2013-02-13 2 views
1

У меня есть dead Простая модель просмотра, которая наследует от INotifyPropertyChanged. После попытки создания некоторых автоматических тестов для этой модели представления я закончил переопределять Equals() и GetHashCode(). Мои тесты прошли, поэтому я был счастливым туристом.Почему переопределяет блок GetHashCode() INotifyPropertyChanged?

Однако теперь привязки данных Windows Forms не реагируют на изменение свойств в моей модели представления. Если я прокомментирую, что моя реализация 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 должны быть равны. Можете ли вы проверить это? –

+0

Я предполагаю, что возвращаемый хэш-код является одним и тем же, поэтому .Net считает его одним и тем же объектом и не запускает событие с измененным свойством. –

+1

Очень неясно. Какие привязки данных? ViewModels для WinForms? И почему тесты требуют GetHashcode? –

ответ

1

Я всегда стараюсь не добавлять код в производственный код, который предназначен исключительно для тестирования. Так как вы внедрили Equals и GetHashCode для целей тестирования, можно было бы реализовать IEqualityComparer<T> и использовать это в своих модульных тестах для выполнения утверждений.

+0

Еще раз спасибо. Очень хороший наконечник. – gcso

Смежные вопросы