2012-09-14 42 views
4

有沒有辦法讓攔截一個方法執行和取消呢? 我只找到一種方法來做從Invoke方法使用Microsoft.Practices.UnityICallHandler拋出異常,但在Invoke方法實現,我只能返回getNext()(input, getNext);如何攔截和取消方法執行

Bassically這是代碼:

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); 
    } 
} 
+0

恐怕上帝不會幫助你,我不認爲這是可能的。 – danielQ

+0

@downvoter評論你的downvote。你可能不知道答案,沒關係,但問題很好,你知道。 –

+0

你爲什麼要取消執行?你的方法在哪裏運行(我的意思是它在同一個線程)?請給我們更多的細節請 – Star

回答

6

這取決於你的意思是通過取消什麼。客戶端代碼調用了該方法,並且它期望結果或異常。

您可以做的是避免在處理程序中調用原始方法,從而有效地停止管道,但需要執行一些操作來完成方法調用。

要繞過包含原始方法的其餘管道,您需要使用IMethodInvocation接口中的CreateMethodReturn方法創建一個新方法,以便成功返回或使用CreateExceptionMethodReturn方法拋出異常。有關詳細信息,請參閱http://msdn.microsoft.com/en-us/library/ee650526(v=pandp.20)

例如,而不是做

return getNext()(input, getNext); 

你可以做

return input.CreateMethodReturn(null, input.Arguments) 

返回NULL。

對於通用處理程序,您需要分析攔截的方法簽名以找出需要返回的內容。

+1

這就是我正在尋找的,爲什麼我在我的研究中錯過了'CreateMethodReturn'!多謝,夥計!你搖滾! –

3

我也建議看看AOP方法。例如PostSharp。 對於不同的用例,它們有很多方面。 詳情這裏: http://www.sharpcrafters.com 你可以看看爲MethodInterceptionAspect

+1

其實這也是AOP,但是謝謝。 http://msdn.microsoft.com/en-us/magazine/gg490353.aspx –

+0

很酷,我很想念這個。謝謝你指點我。 –