2011-11-09 46 views
1

我有一個帶有不同簽名的一堆方法的接口(這裏的上下文是一個WCF回調接口)。我的服務器有一個客戶列表。爲了響應事件,我想調用每個客戶端上的接口方法。在這個調用周圍有一堆鍋爐板代碼(檢查客戶端是否活着,如果此客戶端包含在回調列表中,請嘗試捕獲,如果操作失敗,則丟棄客戶端等)。什麼是將這個鍋爐板代碼放入通用CallBackClients(SomeKindOfGenericDeligate method_to_call)中的最好方法,其中method_to_call是其中一種接口方法。支持來電通用方法調用代碼

ICallback { 
    void Fish(string my_string); 
    void SuperFish(int my_int, double my_double); 
    ... etc ... 
} 

CallBackClients(-- ?? generic delegate ?? --) { 
    foreach (IClientCallback client in client_list) { 
     // The boiler plate code: 
     if (((ICommunicationObject)client.callback).State == CommunicationState.Opened) { 
      try { 
       Do method call based on delagate/lamda code passed in - how ?? 
      } 
      catch (Exception e) { 
       Remove_client(client, method.ToString(), e); 
      } 
     } 
     else 
      Remove_client(client, method.ToString()); 
     } 
    } 
} 

僞代碼:

void EventHandler_A() { 
    // Call Fish method on all clients: 
    CallBackClients(Fish("hello")); 
} 

void EventHandler_B() { 
    // Call SuperFish method on all clients: 
    CallBackClients(SuperFish(10, 5.3); 
} 

回答

2

您可以封裝方法以後調用在任何給定IClientCallBackAction<IClientCallBack>

CallBackClients(Action<IClientCallBack> actionOnDelegates) { 
    foreach (IClientCallback client in client_list) { 
     // The boiler plate code: 
     if (((ICommunicationObject)client.callback).State == CommunicationState.Opened) { 
      try { 
       actionOnDelegates(client); 
      } 
      catch (Exception e) { 
       Remove_client(client, method.ToString(), e); 
      } 
     } 
     else 
      Remove_client(client, method.ToString()); 
     } 
    } 
} 

這將被稱爲像這樣;這些創建匿名方法調用指定的client方法:

void EventHandler_A() { 
    // Call Fish method on all clients: 
    CallBackClients(client => client.Fish("hello")); 
} 

void EventHandler_B() { 
    // Call SuperFish method on all clients: 
    CallBackClients(client => client.SuperFish(10, 5.3); 
} 
+0

如果回調方法返回某事,這是行不通的。但這可能不是問題。 – svick

+0

在這種情況下,'CallBackClients'方法可以在'T'中通用,並且可以將委託改爲'Func ',並以適當的方式傳遞返回值。 – thecoop

+0

回調都是無效/單向 - 所以那裏好。 – Ricibob