だるろぐ

明日できることは、今日しない。

Notify Property Weaver で楽ちんに INotifyPropertyChanged を実装する

f:id:daruyanagi:20120316002236p:plain

INotifyPropertyChanged の実装って面倒じゃないですか。

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

}

これが、

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

こんなに長くなるんですぜ? スニペットがあるとしても面倒くさいし、ミスタイプを IDE で検出できないのでたまにエラいバグをこしらえてしまう。

そんなときは、Notify Property Weaver がオススメ。

http://code.google.com/p/notifypropertyweaver/

.NET プロパティを実装するだけで、依存プロパティ(INotifyPropertyChanged)を実装してくれる。こいつの良いところは、それをコンパイル時にやってくれること。IL を解析してインジェクションしているらしい。

かずきさんのところで紹介されていたイケてる実装もイケているのだけど、やはり実行時に解決する手段だと動作速度に問題がでるみたい。ここに、開発者が時間をかけて実装するか、ユーザーに時間を負担してもらうかというトレードオフがある。

けれど、こうした開発時 or 実行時のコストをコンパイル時に付け替えちゃえば、苦労するのは CPU さんだけになり、開発者もユーザーも幸せになれるというわけなんだね。唯一の難点は PropertyChanged を宣言して利用しないので、下にゲジゲジがついてきえないことだけど、楽ができるならそんなのどうでもいいわけで。

f:id:daruyanagi:20120316002412p:plain

何かわしには分からん副作用があるのかもしれないけれど、とりあえずウチではちゃんと動いているので、これを愛用することにした。もっと早く知っていればよかった。

NuGet でインストールできるのもいいね。