2013-02-07 42 views
0

非標準方法這是很久以前的事,當我在這裏問一個問題最後一次:)現在是時候再問,如我沒有任何想法浩實現的東西,我需要......如何使用.NET反射,以增加新的事件處理程序 - 一個小問題,需要

一個重要的一點要注意 - 我爲的Windows Phone 7.5編寫應用程序,它等於Silverlight的3.0,所以你可以建議一些功能將無法在那裏工作(如iClientMessageInspector是SL缺席3.0/WP7.5或者我不能設置通過使用反射一些類私人領域 - 這是說重要的事情)。

好吧,我的目標是訂閱生成的Web服務代理類的每個事件,其中事件名稱以「Completed」結尾,並理解Web操作是否失敗並帶有Exception(所以 - 目標是有一個處理項目中所有Web服務的錯誤 - 例如,由於會話結束,用戶未被驗證)。

我有一個類來創建所有的Web服務客戶端(在我的項目中有大約4個Web服務引用),所以它可能是有用的,只有一個方法來處理Web服務調用中出現的所有異常由所有網絡服務類型提供。這個類的名字是WebManager的,它包含創建Web服務,這樣的性能(1個屬性一個網絡服務類型):在generaged Web服務代理類

public SomeServiceReference.AuthenticationServiceClient AuthenticationService 
    { 
     get 
     { 
      var web = new SomeServiceReference.AuthenticationServiceClient(); 
      // here i plan to subscribe to xxxCompleted event 
      // i'll provide final code below    
      return web; 
     } 
    } 

(Reference.cs)我有幾個事件和他們解僱每當網絡操作結束之後,所有的人都在這種模式命名爲:「Web_service_OperationName」 +「完成」,示例:

public event System.EventHandler<SomeOperationCompletedEventArgs> SomeOperationCompleted; 

另一個重要的事情提:SomeOperationCompletedEventArgs從標準繼承System.ComponentModel.AsyncCompletedEventArgs,所以在WebManager類中,我可以編寫一些方法並將其用作默認事件LER:

public void TestEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e) 
{ 
    // analyze web-call results here: 
    // do we have exception or web-operation completed successfully 
    // if (e.Error != null) { /*do something there*/ } 
} 

所以我可以做這樣的事情,以訂閱SomeOperationCompleted事件和理解呢操作失敗或不:

public SomeServiceReference.AuthenticationServiceClient AuthenticationService 
    { 
     get 
     { 
      var web = new SomeServiceReference.AuthenticationServiceClient(); 
      web.SomeOperationCompleted += TestEventHandler;   
      return web; 
     } 
    } 

這種方法工作得很好,如果你把斷點TestEventHandler方法將在「e」參數中看到操作細節。

但它不是寫在Reference.cs的每一個事件的所有事件訂閱以最佳的方式,所以我想找到一種方法如何自動化。

我嘗試添加新的事件處理程序,這樣在Reference.cs所有事件:

 public SomeServiceReference.AuthenticationServiceClient AuthenticationService 
    { 
     get 
     { 
      var web = new SomeServiceReference.AuthenticationServiceClient(); 
      var bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; 
      var type = web.GetType(); 
      var eventsCompleted = type.GetEvents(bindingFlags).Where(e => e.Name.EndsWith("Completed")).ToArray(); 
      var methodInfo = this.GetType().GetMethod("TestEventHandler"); 
      foreach (var eventInfo in eventsCompleted) 
      { 
       //Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, this, methodInfo); 
       Delegate handler = Delegate.CreateDelegate(typeof(System.EventHandler<System.ComponentModel.AsyncCompletedEventArgs>), this, methodInfo); 
       //eventInfo.AddEventHandler(this, handler); 
       MethodInfo addHandler = eventInfo.GetAddMethod(); 
       Object[] addHandlerArgs = { handler }; 
       //var p = addHandler.GetParameters(); 
       addHandler.Invoke(web, addHandlerArgs); 
      } 
      return web; 
     } 
    } 

這種做法不工作作爲SomeOperationCompleted具有System.EventHandler <SomeOperationCompletedEventArgs> delegate和TestEventHandler方法有System.EventHandler <System.ComponentModel.AsyncCompletedEventArgs>參數類型。在同一時間,我只能寫web.SomeOperationCompleted += TestEventHandler;

我應該如何修改我的代碼,以便我可以訂閱我的WebManager類中的這些事件?

回答

0

由於通常,之後我張貼我的問題我可以回答這個問題:)

此代碼:

public void TestEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e) 
    { 
     // analyze web-call results here: 
     // do we have exception or web-operation completed successfully 
     // if (e.Error != null) { /*do something there*/ }   
    } 
    public SomeServiceReference.AuthenticationServiceClient AuthenticationService 
    { 
     get 
     { 
      var web = new SomeServiceReference.AuthenticationServiceClient(); 
      var bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; 
      var type = web.GetType(); 
      var eventsCompleted = type.GetEvents(bindingFlags).Where(e => e.Name.EndsWith("Completed")).ToArray(); 
      var methodInfo = this.GetType().GetMethod("TestEventHandler"); 
      foreach (var eventInfo in eventsCompleted) 
      { 
       Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, this, methodInfo); 
       MethodInfo addHandler = eventInfo.GetAddMethod(); 
       Object[] addHandlerArgs = { handler }; 
       addHandler.Invoke(web, addHandlerArgs); 
      } 
      return web; 
     } 
    } 
+0

高興你理解了它。我不確定服務引用的基本類型是什麼,但有沒有可能從服務代理繼承並覆蓋當異步操作完成時始終調用的現有方法?如果可以的話,那麼我會認爲這將是一個更乾淨的解決方案,尤其是因爲您可以控制服務代理的創建。 –

相關問題