2013-10-10 4 views
2

Я хочу передать метод обратного вызова в качестве параметра обобщенному методу, но не могу понять, как это сделать. Я пробовал с Func<IAsyncResult>, но он, похоже, не совместим.передать метод обратного вызова как параметр

public void webRequest(string apiName, string requestMethod, string requestData, Func<IAsyncResult> callback) 
{ 
    ... 
    request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request); 
} 

подпись обратного вызова:

void GetRequestStreamCallback(IAsyncResult asyncResult) 
+0

Не говорите, что «не работает». Расскажите, чего вы ожидаете, и что на самом деле происходит. –

ответ

4

Объявить параметр как Action<T> вместо Func<T>.

public void webRequest(string apiName, string requestMethod, string requestData, Action<IAsyncResult> callback) 

Func<IAsyncResult> требует функцию, которая не принимает никаких параметров и возвращает IAsyncResult экземпляр:

Func<TResult> Delegate

Инкапсулирует метод, который не имеет параметров и возвращает значение типа, указанного в TResult параметр.

Action<T> не возвращает ничего, только принимает параметры:

Action<T> Delegate

Инкапсулирует метод, который имеет один параметр и не возвращает значение.

+0

Посмотрите еще раз на код. Параметр обратного вызова не используется. И почему вы рекомендуете Action (T) здесь? Разумеется, AsyncCallback является желаемым типом. –

1

BeginGetRequestStream ожидает параметр типа AsyncCallback. Поэтому объявите параметр обратного вызова таким типом.

public void webRequest(string apiName, string requestMethod, 
    string requestData, AsyncCallback callback) 
{ 
    ... 
    request.BeginGetRequestStream(callback, request); 
} 

Затем вы можете передать свой метод обратного вызова, так как он соответствует требуемой сигнатуре.

webRequest(apiName, requestMethod, requestData, 
    GetRequestStreamCallback); 
+0

Интересно, почему это было проголосовано. –

Смежные вопросы