使用Action on set来管理getter / setter的更好方法

时间:2017-01-09 15:34:39

标签: c# .net

我有一个对象,它包含一个公共Action,用于在第一个类中的属性发生更改时调用另一个类中的update方法。它看起来像这样:

public class FirstClass {

  public Action Update;

  private string _description;

  public string Description
  {
    get { return _description; }
    set
    {
        if (_description == value) return;
        _description = value;
        Update();
    }
  }
}

这需要应用大约30种不同的属性。有没有更有效的方法来实现这一目标?

1 个答案:

答案 0 :(得分:2)

这看起来像你想要使用面向方面编程(AOP)。我目前使用Postsharp(http://www.postsharp.net)来实现这一目标,但也有其他选择。以下描述与Postsharp有关 - 其​​他实现可能有所不同。

创建一个可以提供更新操作的界面。

public interface IUpdateAction {
   public Action Update { get; }
}

然后创建一个方面,这是作为属性实现的

[PSerializable] 
public class UpdateActionAttribute : LocationInterceptionAspect 
{ 

  public override void OnSetValue(LocationInterceptionArgs args) 
  { 
    if ( args.Value != args.GetCurrentValue() )
    {
      args.Value = args.Value;
      args.ProceedSetValue();
     ((IUpdateAction)args.Instance).Update();
    } 
  } 
}

然后您可以将该方面应用于您的班级

public class FirstClass : IUpdateAction {

  public Action Update {get; set;}

  [UpdateAction]
  public string Description {get;set;}

}

编译代码时,重写器将启动并实现已分配属性的方面。

您可以使用多播将其应用于所有属性或过滤列表。