2011-08-23 99 views
1

我有一个关于事件拦截与C#和Postsharp的问题。Postpost第三方组件事件拦截

我想在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 

但didn't工作。所以我想知道是否有可能实现我想要的。

感谢advace。我希望清楚。

+0

什么样的控件?像telerik控件?为什么不自己处理这些事件呢? –

回答

0

是的,这是可能的。问题是,你正试图将事件拦截方面应用到另一个程序集中定义的事件中,而这是你在代码中无法完成的事件。你甚至不能覆盖的事件,因为它的安装使用在设计代码的基础表格类型背后

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的我不推荐。但是,如果它是其他第三方供应商库,那就去做吧。

+0

非常感谢。 TypeLevelAspect有没有其他的选择?因为我有一个comunity许可证,并且有一个错误,告诉我使用的是未许可的feactures。 –

+0

尝试删除typelevelaspect并只实现IAspectProvider。 –

0

解决方法是以相反方式进行:在挂钩到事件的方法上使用方面,并在符合条件时取消方法的正常执行。这不会阻止事件表单被引发,但它会阻止执行事件处理代码。

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

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

我们走得更远一点,我们在汇编级应用这些方面,并且我们使用CompileTimeValide来识别事件处理方法的签名。从理论上讲,它不是100%可靠的,但迄今为止我们还没有发现这种方法存在任何问题。