我有一个对象,它包含一个公共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种不同的属性。有没有更有效的方法来实现这一目标?
答案 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;}
}
编译代码时,重写器将启动并实现已分配属性的方面。
您可以使用多播将其应用于所有属性或过滤列表。