Postsharp第3方组件事件拦截

时间:2011-08-23 18:36:12

标签: c# events event-handling postsharp

我有一个关于用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

但它不起作用。所以我想知道是否有可能达到我想要的目的。

先谢谢。我希望能够清楚。

2 个答案:

答案 0 :(得分:0)

是的,有可能。问题是,您正在尝试将事件拦截方面应用于在您的代码中无法执行的另一个程序集中定义的事件。您甚至无法覆盖该事件,因为它的设置是使用

背后的设计器代码中的基本Form类型来处理的
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);

您必须修改程序集才能执行此操作。使用以下方面和链接来修改您的

public class EventAspectProvider : TypeLevelAspect , IAspectProvider
    {
        public IEnumerable<AspectInstance> ProvideAspects(object targetElement)
        {
            Type t = (Type)targetElement;

            EventInfo e = t.GetEvents().First(c => c.Name.Equals("FormClosing"));

            return new List<AspectInstance>() { new AspectInstance(e, new EventInter()) };
        }

    }

    [Serializable]
    public class EventInter : EventInterceptionAspect
    {

        public override void OnInvokeHandler(EventInterceptionArgs args)
        {
            int x = 0;

            if (x > 0) //Do you logic here
            {
                args.ProceedInvokeHandler();
            }
        }
    }

基本上它归结为修改我不推荐的System.Windows.Forms.dll。但如果它是其他第三方供应商库,那就去吧。

答案 1 :(得分:0)

解决方法是以相反的方式执行此操作:在与事件挂钩的方法上使用方面,并在满足条件时取消方法的正常执行。这不会阻止引发事件表单,但会阻止执行事件处理代码。

[EventInter]
private void someForm_FormClosed(object sender, EventArg arg) {}

我们在项目中使用这种方法很多。我们有几个方面适用于事件处理方法(异常处理,游标处理等)。

我们更进一步,我们在汇编级应用方面,我们使用CompileTimeValide来识别事件处理方法的签名。从理论上讲,它不是100%可靠,但到目前为止我们还没有发现这种方法存在任何问题。