2014-10-05 43 views
2

我有这样的类型:如何在不更改下一个aspect-node的旧值的情况下获取新值?

[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更改其值(作为aspe中下一个节点的结果cts绑定,我猜),所以当调用OnSetAspect.OnSetValue(...)时,args.Value不再有效。

这两个方面都应该检查以前的值和新的值(意味着要设置的值)并相应地做一些事情。

他们不改变要设置的值,所以他们不应该相互影响,但他们做的......

我怎样才能让这两个方面解开?

回答

0

这里的误解是,当您在类中指定aspect属性时,它不适用于该类,而是应用于该类。多播是一种将属性(不是方面!)递归应用于所有包含的声明或甚至派生的声明的机制。见PostSharp documentation on this matter

该方面实际应用的声明是与方面的级别相匹配的声明。有以下几个基本方面的水平:

  • AssemblyLevelAspect
  • TypeLevelAspect
  • InstanceLevelAspect
  • MethodLevelAspect
  • LocationLevelAspect
  • FieldLevelAspect
  • EventLevelAspect

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

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

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

因此方面并没有真正纠结,它们按顺序应用(您可以指定)。并且总是完整地包装上一个。

相关问题