如何将方面应用于预定义的类?

时间:2016-06-10 14:45:16

标签: postsharp

我是AOP和PostSharp的新手。我试图将一个方面应用于预定义的类,例如System.Windows.Forms.Button类并拦截它的一些方法。 你能指导我如何用PostSharp做到这一点吗?我们可以使用PostSharp来捕获从给定类型的UIElement引发的事件吗?

非常感谢!

2 个答案:

答案 0 :(得分:1)

MethodInterceptionAspect通过拦截呼叫站点上的呼叫来处理在外部DLL中声明的方法。这意味着方法本身不会被转换,而是改变了调用方法的位置。原始组件没有改变。

您可以通过在程序集上组播属性并明确指定AttributeTargetAssemblies

来执行此操作
[assembly:MyAspect(AttributeTargetAssemblies="myassembly,...", AttributeTargetTypes="...", AttributeTargetMembers="..."]

这意味着几乎没有限制。例如,如果从外部代码调用代码,则不会拦截调用。在您的情况下,您可以使用它来拦截始终从设计器代码调用的方法(如this.Controls.Add(...))。

如果源代码中有按钮,我认为会有一种不同的可行方法。如果您创建LocationInterceptionAspect并在Button类型的所有字段上对其进行多播,您将能够拦截应用程序中所有按钮的创建。在方面代码(设置处理程序)中,您可以注册到这些按钮的Clicked事件。

答案 1 :(得分:0)

我怀疑这是可能的,因为我不认为postharp的ilweaving步骤可以操纵已编译的外部dll。

你可以做的是实现你自己的按钮(从按钮延伸)并拦截这些方法