如何在不改变下一个方面节点的旧值的情况下获得新值

本文关键字:情况下 新值 节点 改变 一个方面 | 更新日期: 2023-09-27 18:25:32

我有这个类型:

[NotifyPropertyChangedAspect]
public class MyDataModel
{
    ...
    [OnSetAspect("OnSelectedUserChanged")]
    public string SelectedUser { get; set; }
    ...
}

我应用这些方面: 每个类方面:

[Serializable]
public class NotifyPropertyChangedAspect : LocationInterceptionAspect
{
    ...
    public override void OnSetValue(LocationInterceptionArgs args)
    {
        var newValue = args.Value;
        var oldValue = args.GetCurrentValue();
        args.ProceedSetValue();
        //base.OnSetValue(args); // same effect of ProceedSetValue()
        ... /* some more stuff... */ ...
    }
    ...
}

和每个字段方面:

[Serializable]
public class OnSetAspect : LocationInterceptionAspect
{
    ...
    public override void OnSetValue(LocationInterceptionArgs args)
    {
        var newValue = args.Value;
        var oldValue = args.GetCurrentValue();
        args.ProceedSetValue();
        //base.OnSetValue(args); // same effect of ProceedSetValue()
        ... /* some more stuff... */ ...
    }
    ...
}

现在发生的情况是调用NotifyPropertyChangedAspect.OnSetValue(...),当它调用args.GetCurrentValue()时,args.Value会更改其值(我猜是方面绑定中的下一个节点的结果(,因此当调用OnSetAspect.OnSetValue(...)时,args.Value不再有效。

这两个方面都应该检查以前的值和新值(意味着即将设置的值(并相应地执行某些操作。

它们

不会更改要设置的值,因此它们不应该相互影响,但它们确实...

如何才能使这两个方面解开?

如何在不改变下一个方面节点的旧值的情况下获得新值

这里的误解是,当您在类上指定方面属性时,它不会应用于该类,而是在该类上进行多播。 多播是一种将属性(不是方面!(递归应用于所有包含的声明甚至派生声明的机制。请参阅有关此问题的PostSharp文档。

真正应用方面所依据的声明是与方面级别匹配的声明。有以下基本方面级别:

  • 组装级别方面
  • 类型级别方面
  • 实例级别方面
  • 方法级别方面
  • 位置级别方面
  • 字段级别方面
  • 事件级别方面

然后,Aspect的运行时实例为每个实体存在一次。 即,在您的情况下,每个位置都有一个单例方面实例。

在您的情况下,您将LocationLevelAspect 应用于类,这使得该方面在所有字段上进行多播,因此您最终在每个字段/属性上都有两个 LocationInterceptionAspect 。

args.GetCurrentValue()获取基础属性的值,但不应更改args.Value,它与属性 setter 中的value参数具有相同的语义。

因此,方面并不是真正纠结的,它们是按顺序应用的(您可以指定(。并始终完全包裹前一个。

相关文章: