приведите тип делегата к Делегату и вызовите EndInvoke - PullRequest
1 голос
/ 13 марта 2011

Я унаследовал какой-то многословный, повторяющийся код, который я пытаюсь реорганизовать.Вот лишь некоторые из них:

private void startThreads() 
{ 
    RunRemoteCmdDelegate runRemoteCmdDlg = new RunRemoteCmdDelegate(services.runRemoteCommand); 

    List<IAsyncResult> returnTags = new List<IAsyncResult>(); 

    // asynchronously invokes the delegate multiple times
    foreach (...) 
    { 
        returnTags.Add(runRemoteCmdDlg.BeginInvoke(...)); 
    } 

    MonitorTasks(runRemoteCmdDlg, messages, returnTags, invokationCounter); 

} 

private void MonitorTasks(RunRemoteCmdDelegate theDelegate, List<IAsyncResult> returnTags) 
{ 

        foreach (IAsyncResult returnTag in returnTags) {
            MessageType message = runRemoteCmdDlg.EndInvoke(returnTag);
            messages.Add(message)
        } 
}

Есть много классов, содержащих один и тот же код, но все с разными типами делегатов.

Я хотел бы «поднять» MonitorTasksметод в базовый класс, но он должен работать со всеми различными типами делегатов, например:

private void MonitorTasks(Delegate theDelegate, List<IAsyncResult> returnTags) 
{ 

        foreach (IAsyncResult returnTag in returnTags) {
            MessageType message = runRemoteCmdDlg.EndInvoke(returnTag);  // DOESN'T COMPILE
            messages.Add(message)
        } 
}

Я не могу вызвать EndInvoke () для базового типа Delegate (или MulticastDelegate),так как я могу кодировать этот метод?Нужно ли подходить к этому по-другому?

Я использую C # 3.5, так есть ли какой-нибудь способ использовать Func, Action и т. Д., И при этом иметь возможность вызывать EndInvoke?

1 Ответ

1 голос
/ 13 марта 2011

Вы можете использовать рефлексию, чтобы получить доступ к методу EndInvoke() делегата:

using System.Reflection;

private void MonitorTasks(Delegate theDelegate, List<IAsyncResult> returnTags) 
{ 
    MethodInfo endInvoke = theDelegate.GetType().GetMethod("EndInvoke",
        new Type[] { typeof(IAsyncResult) });
    foreach (IAsyncResult returnTag in returnTags) {
        MessageType message = (MessageType) endInvoke.Invoke(theDelegate,
            new object[] { returnTag });
        messages.Add(message);
    } 
}

См. этот блог для более общего взгляда на проблему "забей и забудь".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...