我通过使用[NotifyPropertyChanged]属性装饰我的业务类来使用PostSharp解决方案来实现INotifyPropertyChanged。
一切正常。
现在我编写了一个处理属性更改的自定义方面,以便在某些特殊属性更改时设置一些自定义标志。这些方面名为[HandlePropertyChanged],单独使用时可以使用。
现在我尝试结合使用这两个方面。正如我在PostSharp页面上看到的那样,我可以手动命令它们以确保使用固定订单
[NotifyPropertyChanged(AspectPriority = 0)]
[HandlePropertyChanged(AspectPriority = 1)]
在这种情况下,我可以构建我的解决方案,但因为“NotifyPropertyChanged”在“HandlePropertyChanged”之前运行,我的属性上的更改已经完成,并且自定义逻辑无法正确运行。
如果我试试这个
[HandlePropertyChanged(AspectPriority = 0)]
[NotifyPropertyChanged(AspectPriority = 1)]
我的构建失败,文本底部出现错误(见下文)。
最好的方法是简单地执行NotifyPropertyChanged在我的自定义方面所做的事情而忘记PostSharp方面
这可能吗?
0:错误C:\ Source \ WAVE \ WAVE.Data.Contracts \ Entities \ Base \ EntityBase.cs(17,16)PS0115:“TopMotive.WAVE.Data.Contracts.Entities.Base.EntityBase`1”上的冲突方面:根据方面依赖性,转换“方面的实例化PostSharp.Patterns.Model.NotifyPropertyChangedAttribute”应位于转换之前和之后“实例化字段的绑定集合”PostSharp.Patterns.Model.NotifyPropertyChangedAttribute / LocationBindings“。”。
在PostSharp 5.0.52和PostSharp 6.0.16 RC中修复了此错误。
尝试优越和免费的替代方案:Stepen Cleary的计算属性。 https://github.com/StephenCleary/CalculatedProperties/blob/master/README.md
我在生产中使用它们并发现它比PostSharp的方面要好得多。
同样来自PostSharp文档:
“如果属性getter从其类或委托调用虚方法,或引用另一个对象的属性(不使用规范形式this.field.Property),PostSharp将生成错误,因为它无法在构建时解析这种依赖当您的属性getter包含复杂的数据流(如循环)或对其他类的方法(属性获取者除外)的调用时,同样的限制也适用。当发生这种情况时,您可以重构代码,以便PostSharp自动分析它,或者你可以接管分析代码的责任“
这些限制均不适用于计算属性。它可以做循环,虚方法,LINQ到对象,基本上你可以想象的任何运行时依赖都无关紧要。依赖图在运行时重新连接,只是在没有任何仪式的情况下工作。它们也很快。