Использование TypeDescriptor для проверки правильности propertyName при использовании INotifyPropertyChanged - PullRequest
1 голос
/ 31 декабря 2010

Мой вопрос больше соответствует принципам хорошей практики при использовании INotifyPropertyChanged.

Я создал базовый класс, который реализует INotifyPropertyChanged, с намерением использовать этот класс в большинстве случаев привязки пользовательской модели представления.

В основном у меня есть метод DispatchPropertyChange, который принимает методимя (строка) свойства меняется.Это довольно просто, но строки явно подвержены ошибкам.

Я бы хотел убедиться, что свойство действительно перед отправкой, но я не уверен, что это хороший подход.Пока моя вспомогательная функция выглядит следующим образом.

private void ValidateProperty( string prop )
{
    if( TypeDescriptor.GetProperties(this)[prop] == null )
    {
        //throw error
    }
} 

Я думаю, что эта стратегия может замедлить ход событий.У кого-нибудь есть другой подход или метод проверки правильности имени свойства?

Ответы [ 2 ]

2 голосов
/ 31 декабря 2010

Существует множество реализаций (как правило, незначительных отличий) решения слабо типизированной проблемы INotifyPropertyChanged.PropertyChanged.

Часть одного примера ниже;который имеет дело с вашим null чеком ...

protected void RaiseChanged<TProperty>(Expression<Func<TProperty>> propertyExpresion)
{
    var property = propertyExpresion.Body as MemberExpression;
    if (property == null || !(property.Member is PropertyInfo) ||
        !IsPropertyOfThis(property))
    {
        throw new ArgumentException(string.Format(
            CultureInfo.CurrentCulture,
            "Expression must be of the form 'this.PropertyName'. Invalid expression '{0}'.",
            propertyExpresion), "propertyBLOCKED EXPRESSION;
    }

    this.OnPropertyChanged(property.Member.Name);
}
0 голосов
/ 06 января 2011

Или вы можете выполнить проверку имени свойства во время компиляции

NotifyPropertyWeaver

...