PostSharpでINotifyPropertyChanged

昨日の記事に書いたC#-users.jpで話題に上ってた話。
http://d.hatena.ne.jp/ufcpp/20090326
こちらにまとめられているINotifyPropertyChanedのこと

AOPで何とかなれば・・・という話をしてたときに
PostSharpことを誰かが言ってました。

まえに、ちょこっと触ったきり、忘れていたので
この機会に、それを利用して実装しようかなと。

目標はufcppさんのところで書かれている

[NotifyChanged]
public int X { set; get; }

上記みたいな感じで更新通知ができること。
と、やってみたらできました。

[Notify] public int prop1 { get; set; } public int prop2 { get; set; }


こう書いて

 

 

 

Console.WriteLine("SetProp:prop1");
target.prop1 = 1;
Console.WriteLine("SetProp:prop2");
target.prop2 = 1;

こう呼び出したら、結果が
SetProp:prop1
Notify :prop1
SetProp:prop2
続行するには何かキーを押してください . . .
きちんと、prop1が更新されたことが通知されました。
ソースコード上は自動プロパティのまま、通知処理が組み込めるので
かなりすっきりしたソースコードになると思います。
PostSharp自体、会社などのチームで使う場合全員が
インストールしなければ・・・など敷居がたかいのですが、
個人開発の分を中心に、PostSharpをもうちょっと
使い込んでみたいとおもいます。
(幸い、Silverlightにも対応らしいですし)
以下、ソースコード全文
using System;
using System.ComponentModel;
using PostSharp.Laos;
namespace NotifyAttribute
{
class Program
{
static void Main(string[] args)
{
var target = new Target();
target.PropertyChanged += new PropertyChangedEventHandler(target_PropertyChanged);
Console.WriteLine("SetProp:prop1");
target.prop1 = 1;
Console.WriteLine("SetProp:prop2");
target.prop2 = 1;
}
static void target_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
Console.WriteLine("Notify :{0}", e.PropertyName);
}
}
class Target : INotifyPropertyChanged
{
[Notify]
public int prop1 { get; set; }
public int prop2 { get; set; }
#region INotifyPropertyChanged メンバ
public event PropertyChangedEventHandler PropertyChanged;
#endregion
public void NotifyPropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
[Serializable]
class NotifyAttribute : OnMethodBoundaryAspect
{
public override void OnExit(MethodExecutionEventArgs eventArgs)
{
if (eventArgs.Method.Name.StartsWith("set_"))
{
//正しくは、インターフェース経由でNotifyPropertyChanged相当を呼ぶべき
((Target)eventArgs.Instance).NotifyPropertyChanged(eventArgs.Method.Name.Remove(0, 4));
}
}
}
}

現在のレート 4.8 (5人)

  • Currently 4.8/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Posted by: zio
Posted on: 2009/03/27 at 7:51
Categories: C# | PostSharp | コーディング
Actions: E-mail | Kick it! | DZone it! | del.icio.us
Post Information: Permalink | コメント (1) | Post RSSRSS comment feed