REVIEW(12/04/19)

“INotifyPropertyChanged”実装を支援するVS拡張機能「Notify Property Weaver」

導入するだけで煩雑な“INotifyPropertyChanged”の実装が不要に

「Notify Property Weaver」v1.42.0.0「Notify Property Weaver」v1.42.0.0

 「Notify Property Weaver」は、“INotifyPropertyChanged”インターフェイスの実装を支援する「Visual Studio」用の拡張機能。「Visual Studio 2010」に対応するフリーソフトで、編集部にてWindows 7上の「Visual Studio 2010 Professional」で動作を確認した。ライブラリサイト“Visual Studio Gallery”からダウンロードできる。

 WPF/Silverlightなどでは、“データバインディング”という仕組みが標準で用意されている。この仕組を利用すれば、ビュー(ユーザーインターフェース)へオブジェクトをバインド(紐付け)して、当該オブジェクトの内容変更を自動的にビューへ反映できるほか、逆にビューへの入力をオブジェクトへ反映させることも可能。見た目と機能を分離できるので、再利用性が向上したり、設計を簡素に保つことができるほか、テストが容易になるなどの効果も期待できる。

 “データバインディング”を利用するには、ビューへプロパティの変更を通知するためのインターフェイス“INotifyPropertyChanged”を、バインドするオブジェクトが実装している必要がある。たとえば、以下のコードがあるとする。

public class Person  {      public string GivenNames { get; set; } // 名      public string FamilyName { get; set; } // 姓      public string FullName {  // 氏名          get { return string.Format("{0} {1}", GivenNames, FamilyName); }      }  }

 これに“INotifyPropertyChanged”インターフェイスを実装すると、以下のようなコードになる。

public class Person : INotifyPropertyChanged  {      public event PropertyChangedEventHandler PropertyChanged;        string givenNames;      public string GivenNames // 名      {          get { return givenNames; }          set          {              if (value != givenNames)              {                  givenNames = value;                  OnPropertyChanged("GivenNames"); // 名が変わった                  OnPropertyChanged("FullName");   // 氏名が変わった              }          }      }        string familyName;      public string FamilyName // 姓      {          get { return familyName; }          set          {              if (value != familyName)              {                  familyName = value;                  OnPropertyChanged("FamilyName"); // 姓が変わった                  OnPropertyChanged("FullName");   // 氏名が変わった              }          }      }        public string FullName // 氏名      {          get          {              return string.Format("{0} {1}", GivenNames, FamilyName);          }      }        // プロパティが変更されたことを通知するイベントを発行      public virtual void OnPropertyChanged(string propertyName)      {          var propertyChanged = PropertyChanged;          if (propertyChanged != null)          {              propertyChanged(this, new PropertyChangedEventArgs(propertyName));          }      }  }

 このようにソースコードが非常に煩雑になる上、プロパティの変更通知がプロパティ名(string型)でやり取りされるためIDEのコード補完機能が利用できないため、ミスタイプを誘発することも少なくない。

 そこで便利なのが「Notify Property Weaver」だ。本拡張機能は、中間言語(IL)へコンパイルされたコードを分析し、ビルド時にプロパティの変更通知を行うコードを注入(Weave:織り込む)する。そのため、煩雑な“INotifyPropertyChanged”の実装が不要になり、プログラマーはそれ以外の要素の設計と実装に注力できるようになる。

煩雑な“INotifyPropertyChanged”の実装が不要に煩雑な“INotifyPropertyChanged”の実装が不要に

ビルド時に中間言語(IL)へコンパイルされたコードを分析し、プロパティの変更通知を行うコードを注入ビルド時に中間言語(IL)へコンパイルされたコードを分析し、プロパティの変更通知を行うコードを注入

 ちなみに、「Notify Property Weaver」を利用した場合、上記のコードは以下のように簡略化することが可能。

public class Person: INotifyPropertyChanged{public event PropertyChangedEventHandler PropertyChanged;public string GivenNames { get; set; } // 名      public string FamilyName { get; set; } // 姓      public string FullName {  // 氏名          get { return string.Format("{0} {1}", GivenNames, FamilyName); }      }  }

 “名”や“姓”の変更にともなう“氏名”の変化も、「Notify Property Weaver」が検知してコードを自動挿入してくれるため、正常にビューへ反映される。

 なお作者によると、.NET Framework 3.5/4/4.5、Silverlight 3/4/5(Windows Phone 7を含む)で動作を確認しているとのこと。

【著作権者】
Simon Cropp 氏
【対応OS】
(編集部にてWindows 7で動作確認)
【ソフト種別】
フリーソフト
【バージョン】
1.42.0.0(12/04/09)

(柳 英俊)