다른 시그니처가있는 여러 메서드가있는 인터페이스가 있습니다 (여기서 컨텍스트는 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);
}
이 작동하지 않을 :이 지정된
client
의 메소드를 호출 할 수있는 익명의 방법을 만들 수 있습니다. 하지만 여기에는 문제가 없을 것입니다. – svick이 경우,'CallBackClients' 메소드는'T'에서 일반화 될 수 있고, 델리게이트는'Func'로 변경 될 수 있습니다. 반환 값은 적절한 방식으로 전달됩니다. –
thecoop
콜백은 모두 무효입니다. - 그래도 괜찮습니다. – Ricibob