Использование TypeDescriptor для проверки действительного имени свойства при использовании INotifyPropertyChanged

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

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

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

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

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

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


person Nicholas    schedule 31.12.2010    source источник


Ответы (2)


Существует множество реализаций (обычно с небольшими отличиями) решения проблемы нечеткой типизации 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);
}
person Aaron McIver    schedule 31.12.2010
comment
Это интересно... Я не рассматривал строгую типизацию - person Nicholas; 31.12.2010
comment
Какова производительность разделения делегата propertyExpression во время выполнения? Строгая типизация всегда хороша, но медленнее ли она, чем проверка TypeDescriptor.GetProperties, которую можно отключить в релизной сборке с помощью ConditionalAttribute в методе ValidateProperty? - person David Yaw; 01.01.2011
comment
@David, я лично никогда не проверял это; однако я использовал метод строгой типизации во многих приложениях, и у меня никогда не было проблем. Я предполагаю, что это довольно незначительно из-за типичного размера модели/представления. - person Aaron McIver; 01.01.2011

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

NotifyPropertyWeaver

person Simon    schedule 06.01.2011