我有一个关于用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
但它不起作用。所以我想知道是否有可能达到我想要的目的。
先谢谢。我希望能够清楚。
答案 0 :(得分: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。但如果它是其他第三方供应商库,那就去吧。
答案 1 :(得分:0)
解决方法是以相反的方式执行此操作:在与事件挂钩的方法上使用方面,并在满足条件时取消方法的正常执行。这不会阻止引发事件表单,但会阻止执行事件处理代码。
[EventInter]
private void someForm_FormClosed(object sender, EventArg arg) {}
我们在项目中使用这种方法很多。我们有几个方面适用于事件处理方法(异常处理,游标处理等)。
我们更进一步,我们在汇编级应用方面,我们使用CompileTimeValide来识别事件处理方法的签名。从理论上讲,它不是100%可靠,但到目前为止我们还没有发现这种方法存在任何问题。