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)

(柳 英俊)