Хорошо, прежде всего, для этой цели я лично использую реализацию ObservableObject из MVVM Foundation . Это проверка во время выполнения только для DEBUG-сборки, почти идентичная вашей.
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
this.VerifyPropertyName(propertyName);
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}
[Conditional("DEBUG")]
[DebuggerStepThrough]
public void VerifyPropertyName(string propertyName)
{
// Verify that the property name matches a real,
// public, instance property on this object.
if (TypeDescriptor.GetProperties(this)[propertyName] == null)
{
string msg = "Invalid property name: " + propertyName;
if (this.ThrowOnInvalidPropertyName)
throw new Exception(msg);
else
Debug.Fail(msg);
}
}
Вероятно, это самый простой способ, но у него есть определенные недостатки: вам нужно иметь возможность наследовать от некоторого базового класса, он работает только во время выполнения (хотя этого всегда было достаточно в моем wpf-опыте), он, безусловно, выглядит как «патч» для отсутствующей статической проверки.
У вас есть несколько способов включить статический анализ / статические инструменты для этого случая:
- Как говорит Марк, использует лямбда-нотацию и извлекает строку во время выполнения .
- Написать пользовательское правило FxCop .
- Используйте инструмент AOP для пост-обработки кода с некоторой мета-разметкой.
Что касается CodeContracts, я считаю, что он еще недостаточно совершенен для обработки такого рода проверок в статическом анализе. Представьте себе, что он должен проанализировать вашу лямбду, понять, как она может быть ошибочной из-за неправильного propertyName
, найти все вызовы этого метода, выяснить все возможные входы и т. Д. Это просто неправильный инструмент для такого рода проверки. 1025 *