泛型方法调用代码

本文关键字:代码 调用 泛型方法 | 更新日期: 2023-09-27 18:13:52

我有一个带有不同签名的一堆方法的接口(这里的上下文是WCF回调接口)。我的服务器有一个客户端列表。为了响应事件,我想在每个客户机上调用接口的方法。有一堆锅炉板代码围绕这个调用(检查客户端是活的,这个客户端应该包含在回调列表中,尝试捕获,如果操作失败放弃客户端等)。什么是最好的方法把这些锅炉板代码拉到一个泛型的CallBackClients(somekindofgenericdelegate 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);
}

泛型方法调用代码

您可以将一个方法封装在Action<IClientCallBack>中,以便稍后在任何给定的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());
        }
    }
}

this将被这样调用;这些创建一个匿名方法来调用指定的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);
}