English 中文(简体)
通用方法代码
原标题:Generic method call code

I have an interface with a bunch of methods with different signatures (context here is a WCF callback interface). My server has a list of clients. In response to events I want to call a method of the interface on every client. There is a bunch of boiler plate code around this call (check client is alive, should this client be include in list to callback, try catch, drop client if operation fails etc). Whats the best way to pull out this boiler plate code into a generic CallBackClients(SomeKindOfGenericDeligate method_to_call) where method_to_call is one of the interface methods.

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());
        }
    }
}

Pseudo Code for callser:

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);
}
最佳回答

You can encapsulate a method to call later on any given IClientCallBack in an Action<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());
        }
    }
}

之后,这便会被称作是这样,从而形成一种匿名方法,在指定的<条码>上使用这种方法。

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);
}
问题回答

暂无回答




相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签