Что такое [NotifyPropertyChangedInvocator] в С# при реализации INotifyPropertyChanged?
Я вижу два типа реализации INotifyPropertyChanged
-
Первый:
public abstract class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
-
Второй:
public abstract class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Во втором вы видите дополнительный атрибут [NotifyPropertyChangedInvocator]
для метода OnPropertyChanged
В моем случае оба ведут себя одинаково, но что, почему и когда использовать этот [NotifyPropertyChangedInvocator]
, каковы преимущества этого? Я искал в Интернете, но не нашел хорошего ответа.
Ответы
Ответ 1
Это атрибут Resharper из их аннотаций, предназначенный для предупреждения, тогда ваш код выглядит подозрительно :)
Учти это:
public class Foo : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void NotifyChanged(string propertyName) { ... }
private string _name;
public string Name {
get { return _name; }
set {
_name = value;
NotifyChanged("LastName");//<-- warning here
}
}
}
С [NotifyPropertyChangedInvocator]
attribut на NotifyChanged
методе Resharper даст вам предупреждение, что вы вызываете метод с (предположительно) неправильным значением.
Поскольку Resharper теперь знает, что метод должен вызываться для уведомления об изменениях, он поможет вам преобразовать обычные свойства в свойства с уведомлением об изменениях: ![enter image description here]()
Преобразование это в это:
public string Name
{
get { return _name; }
set
{
if (value == _name) return;
_name = value;
NotifyChange("Name");
}
}
Этот пример [NotifyPropertyChangedInvocator]
из документации по [NotifyPropertyChangedInvocator]
найденной здесь:
![enter image description here]()
Ответ 2
NotifyPropertyChangedInvocator
- это Resharper.
Вы можете просто удалить его из своего кода, чтобы он работал
Аналогичный вопрос задавали здесь:
Кто-нибудь знает, как получить [NotifyPropertyChangedInvocator]