我有一个在类上实现INotifyPropertyChanged的Aspect。该方面包括以下内容:
[OnLocationSetValueAdvice, MethodPointcut("SelectProperties")]
public void OnPropertySet(LocationInterceptionArgs args)
{
var currentValue = args.GetCurrentValue();
bool alreadyEqual = (currentValue == args.Value);
// Call the setter
args.ProceedSetValue();
// Invoke method OnPropertyChanged (ours, the base one, or the overridden one).
if (!alreadyEqual)
OnPropertyChangedMethod.Invoke(args.Location.Name);
}
当我正常实例化类时,这很好用,但是当我使用DataContractSerializer反序列化类时遇到问题。这绕过了构造函数,我猜测它会干扰PostSharp设置自己的方式。这最终会在截获的属性setter中导致NullReferenceException,但在它调用自定义OnPropertySet之前,所以我猜它会干扰设置LocationInterceptionArgs。
还有其他人遇到过这个问题吗?有没有办法解决它?
我做了一些研究,发现我可以通过这样做解决问题:
[OnDeserializing]
private void OnDeserializing(StreamingContext context)
{
AspectUtilities.InitializeCurrentAspects();
}
我想,好吧,那不是太糟糕,所以我尝试在我看来这样做:
private IEnumerable<MethodInfo> SelectDeserializing(Type type)
{
return
type.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public).Where(
t => t.IsDefined(typeof (OnDeserializingAttribute), false));
}
[OnMethodEntryAdvice, MethodPointcut("SelectDeserializing")]
public void OnMethodEntry(MethodExecutionArgs args)
{
AspectUtilities.InitializeCurrentAspects();
}
不幸的是,尽管它正确拦截了该方法,但它不起作用。我认为对InitializeCurrentAspects的调用没有得到正确的转换,因为它现在位于Aspect中,而不是直接在Aspect加强类中。有没有办法可以干净地自动化这个,这样我就不用担心在每个想要拥有Aspect的课程上调用它?
答案 0 :(得分:2)
最近添加了对序列化的支持,并且可以作为修补程序使用。
http://www.sharpcrafters.com/downloads/postsharp-2.0/hot-fixes