++C++; // 未確認飛行 C ブログ

http://ufcpp.net/

コードスニペットを使った INotifyPropertyChanged の実装(更新)

leave a comment »

追記: 再度更新

昔、「手書きだけで INotifyPropertyChanged の実装をうまくやろうと頑張るのは厳しい、コードスニペット使うべき」という話をしたわけですが、自動生成するコード量が多すぎると不評でした。

その後、またちょっと考えてみた結果、以下のような感じに修正。

かなりすっきりした。以下、サンプルの一部抜粋。色つきの部分がコードスニペットで生成した部分。

public class SampleViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    #region Name

    public string Name
    {
        get { return _Name; }
        set
        {
            _Name = value;
            PropertyChanged.Raise(this, _nameName);
        }
    }

    private string _Name;
    private string _nameName = PropertyName<SampleViewModel>.Get(x => x.Name);

    #endregion
}

public static class PropertyName<TInstance>
{
    public static string Get<TMember>(Expression<Func<TInstance, TMember>> propertyExpression)
    {
        var memberExp = propertyExpression.Body as MemberExpression;
        if (memberExp == null)
        {
            throw new ArgumentException();
        }

        var senderExp = memberExp.Expression as ConstantExpression;
        if (senderExp == null)
        {
            throw new ArgumentException();
        }

        return memberExp.Member.Name;
    }
}

public static partial class PropertyChangedEventHandleExtensions
{
    public static void Raise(this PropertyChangedEventHandler handler, object sender, params string[] propertyNames)
    {
        if (handler == null)
        {
            return;
        }

        foreach (var name in propertyNames)
        {
            handler(sender, new PropertyChangedEventArgs(name));
        }
    }
}

広告

Written by ufcpp

2010年1月29日 @ 06:50

カテゴリー: 未分類

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。