web-dev-qa-db-ja.com

INotifyPropertyChangedを実装する場合、C#の[NotifyPropertyChangedInvocator]とは何ですか?

INotifyPropertyChangedの2つのタイプの実装が表示されます

  • 最初の1つ:

    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));
            }
        }
    }
    
  • 2番目:

    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));
            }
        }
    }
    

2番目の方法では、メソッドOnPropertyChangedに追加の属性[NotifyPropertyChangedInvocator]があります

私の場合、どちらも同じように動作しますが、この[NotifyPropertyChangedInvocator]を使用する理由、理由、およびその理由は何ですか?インターネットで検索しましたが、良い答えが見つかりませんでした。

37
Waqas Idrees

Annotations の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]NotifyChangedメソッドの属性Resharperは、(おそらく)間違った値でメソッドを呼び出しているという警告を表示します。

Resharperは変更通知を行うためにthatメソッドを呼び出す必要があることを知っているため、通常のプロパティを変更通知のあるプロパティに変換するのに役立ちます。 enter image description here
これを次のように変換します:

public string Name
{
  get { return _name; }
  set
  {
    if (value == _name) return;
    _name = value;
    NotifyChange("Name");
  }
}



この例は、[NotifyPropertyChangedInvocator]属性は次のとおりです。
enter image description here

70
Jens Kloster

NotifyPropertyChangedInvocatorResharper 機能です。

動作させるためにコードから単純に削除することができます

同様の質問がここで尋ねられました:

[NotifyPropertyChangedInvocator]を取得する方法を知っている人はいますか

2