Postsharp 3rd方组件事件拦截
我有一个关于使用 C# 和 Postsharp 进行事件拦截的问题。
我想在 postsharp 中取消执行像 BeforeDropDown、RowSelected MouseClick 和 EventInterceptionAspect 这样的事件。
但我找不到可以编写代码的合适地方。 示例:
我尝试了这样的事情:
[Serializable]
class EventInter : EventInterceptionAspect
{
public override bool CompileTimeValidate(System.Reflection.EventInfo targetEvent)
{
return "FormClosed".Equals(targetEvent.Name);
}
public override void OnInvokeHandler(EventInterceptionArgs args)
{
if condition executes method otherwise no
}
}
形式为:
[EventInter]
public partial class Frm_RomperMesa : KryptonForm
但它不起作用。所以我想知道是否有可能实现我想要的。
提前致谢。我希望说清楚。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
是的,这是可能的。问题是,您试图将事件拦截方面应用于另一个程序集中定义的事件,而您无法在代码中执行此操作。您甚至无法覆盖该事件,因为它设置为使用后面的设计器代码中的基本表单类型进行处理,
您必须修改程序集才能执行此操作。使用以下方面和链接修改您的
基本上可以归结为修改 System.Windows.Forms.dll 我不推荐。但如果是其他第三方供应商库,那就去吧。
yes, it is possible. The problem is, you're trying to apply an event interception aspect to an event defined in another assembly which you can't do within your code. You can't even override the event because it's setup to be handled using the base Form type in the designer code behind
you will have to modify the assembly to do this. Use the following aspect and the links to modify your
Basically it boils down to modifying the System.Windows.Forms.dll which I don't recommend. But if it's some other 3rd party vendor library, then go for it.
解决方法是反其道而行之:在挂钩到事件的方法上使用方面,并在满足条件时取消该方法的正常执行。这不会阻止引发事件表单,但会阻止执行事件处理代码。
我们在项目中经常使用这种方法。我们有几个方面适用于事件处理方法(异常处理、游标处理等)。
我们更进一步,我们在程序集级别应用这些方面,并使用 CompileTimeValide 来识别事件处理方法的签名。从理论上讲,它并不是100%可靠,但到目前为止我们还没有发现这种方法有任何问题。
A workaround is to do it the other way around: Use an aspect on the method that is hooked to the event and cancel the normal execution of the method if the condition is met. This does not prevent the event form being raised but it prevents your event handling code from being executed.
We use this approach a lot in our project. We have several aspects that apply to event handling methods (exception handling, cursors handling, etc...).
We go a little further, we apply the aspects at the assembly level and we use CompileTimeValide to recognize the signature of an event handling method. In theory, it's not 100% reliable, but we have not found any problems with this approach so far.