在前面几篇PostSharp的随笔,今天来一个简单的demo。PostSharp的其他内容将会在后面继续更新。

      如果我们了解wpf或者silverlight开发中的MVVM模式,就知道框架要求我们的ViewModel必须实现INotifyPropertyChanged,来得到属性改变的事件通知,更新UI。

实现INotifyPropertyChanged接口很简单,而且一沉不变,属于重复劳动。在这里我们将看看如何运用PostSharp来解决我们的重复劳动。当然这里只是一个demo演示,具体在项目开发中你直接实现INotifyPropertyChanged,或者AOP植入,这取决我个人和团队文化。

     在下面我们将会用到Postsharp的:

  1. IntroduceMember:向目标对象植入成员。
  2. IntroduceInterface:使得目标实现接口,参数接口类型。
  3. OnLocationSetValueAdvice:PostSharp的一种Advice Aspect。

   下面我就看看我们的代码是如何简洁来实现:

 
   
   
   
   
  1. using System;  
  2. using System.ComponentModel;  
  3.  
  4. using PostSharp.Aspects;  
  5. using PostSharp.Aspects.Advices;  
  6. using PostSharp.Extensibility;  
  7.  
  8. namespace PostSharpDemo  
  9. {  
  10.     [Serializable]  
  11.     [IntroduceInterface(typeof(INotifyPropertyChanged), OverrideAction = InterfaceOverrideAction.Ignore)]  
  12.     public class INotifyPropertyChangedAttribute : InstanceLevelAspect, INotifyPropertyChanged  
  13.     {  
  14.  
  15.         [OnLocationSetValueAdvice, MulticastPointcut(Targets = MulticastTargets.Property)]  
  16.         public void OnValueChanged(LocationInterceptionArgs args)  
  17.         {  
  18.             var current=args.GetCurrentValue();  
  19.             if ((args.Value != null && (!args.Value.Equals(current)))  
  20.                 || (current != null && (!current.Equals(args.Value))))  
  21.             {  
  22.                 args.ProceedSetValue();  
  23.                 this.OnRaisePropertyChange(args.Location.Name);  
  24.             }  
  25.         }  
  26.  
  27.         #region INotifyPropertyChanged 成员  
  28.  
  29.         [IntroduceMember(IsVirtual = true, OverrideAction = MemberOverrideAction.Ignore)]  
  30.         public event PropertyChangedEventHandler PropertyChanged;  
  31.  
  32.  
  33.  
  34.  
  35.         protected void OnRaisePropertyChange(string property)  
  36.         {  
  37.             if (PropertyChanged != null)  
  38.             {  
  39.                 PropertyChanged.Invoke(this.Instance, new PropertyChangedEventArgs(property));  
  40.             }  
  41.         }  
  42.         #endregion  
  43.     }  
  44.  

测试代码:

 

   
   
   
   
  1. static void Main(string[] args)   
  2.         {   
  3.  
  4.              Student stu = new Student();   
  5.             (stu as INotifyPropertyChanged).PropertyChanged += new PropertyChangedEventHandler(Program_PropertyChanged);   
  6.             stu.ID = 10;   
  7.             stu.Name = "wolf";   
  8.             stu.Sex = "Man";   
  9.             stu.ID = 2;   
  10.             Console.Read();   
  11.         }   
  12.  
  13.         static void Program_PropertyChanged(object sender, PropertyChangedEventArgs e)   
  14.         {   
  15.             Console.WriteLine(string.Format("property {0} has changed", e.PropertyName));   
  16.         }  
  17. [INotifyPropertyChanged]   
  18.    public class Student   
  19.    {   
  20.        public string Name   
  21.        { get; set; }   
  22.  
  23.        public string Sex   
  24.        { get; set; }   
  25.  
  26.        public int ID   
  27.        { get; set; }   
  28.    } 

运行效果如下:

AOP之PostSharp4-实现类INotifyPropertyChanged植入_第1张图片

附件下载:demo

本博客中相关文章有:

 

  • AOP之PostSharp初见-OnExceptionAspect
  • AOP之PostSharp2-OnMethodBoundaryAspect
  • AOP之PostSharp3-MethodInterceptionAspect
  • AOP之PostSharp4-实现类INotifyPropertyChanged植入
  • AOP之PostSharp5-LocationInterceptionAspect
  • AOP之PostSharp6-EventInterceptionAspect
  • http://www.cnblogs.com/whitewolf/category/312638.html