4

有没有办法拦截方法执行并取消它?我只找到了一种Invoke方法来使用Microsoft.Practices.Unityand从方法中抛出异常ICallHandler,但是在Invoke方法实现上,我只能 return getNext()(input, getNext);

基本上这是代码:

public class TestHandler : ICallHandler
{
    public int Order { get; set; }

    public IMethodReturn Invoke(IMethodInvocation input, 
                                GetNextHandlerDelegate getNext)
    {
        Console.WriteLine("It's been intercepted.");

        // Here... please Lord, tell me I can cancel it, I'm a good person.
        return getNext()(input, getNext);
    }
}
4

2 回答 2

7

这取决于您所说的取消是什么意思。客户端代码已经调用了该方法,它期待一个结果或一个异常。

您可以做的是避免在处理程序中调用原始方法,从而有效地停止管道,但是您需要做一些事情来完成方法调用。

要绕过包含原始方法的其余管道,您需要使用 IMethodInvocation 接口中的 CreateMethodReturn 方法创建一个新的方法返回以成功返回,或者使用 CreateExceptionMethodReturn 方法引发异常。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ee650526(v=pandp.20)

例如,而不是做

return getNext()(input, getNext);

你可以做

return input.CreateMethodReturn(null, input.Arguments)

返回空值。

对于通用处理程序,您需要分析截获的方法签名以找出需要返回的内容。

于 2012-09-14T21:04:24.653 回答
3

我还建议查看 AOP 方法。例如 PostSharp。对于不同的用例,它们有很多方面。详情在这里: http ://www.sharpcrafters.com 你可以看看 MethodInterceptionAspect

于 2012-09-14T21:52:04.847 回答