Получить универсальный тип в асинхронном обратном вызове - PullRequest
0 голосов
/ 09 марта 2011

Я пишу библиотеку, которая связывается со службой JsonRpc через HTTP.Все операции HTTP выполняются асинхронно.

Каждая команда, отправленная службе JsonRpc, приводит к тому, что сервер отвечает списком элементов.

Процесс - пользователь вызывает метод GetXXXX и предоставляет обратный вызов (очень урезанная версия):

GetArtists(userCallback)
{
   var state = new AsyncState<Artist>(userCallback);

   jsonRpcClient.post(uri, internalCallback, AsyncState);
}


GetArtistsInternalCallback(httpStatusCode, responseBody, asyncState)
{
    var realState = asyncState as AsyncState<Artist>.


   // parse response body in to list of Artists


   realState.UserCallback(List<Artist>);
}


UserCallback(List<Artist> artists)
{
   User can do something with result
}

Теперь состояние Async является общим, поэтому, если у меня, например, был метод с именем GetAlbumsпользователь должен предоставить обратный вызов с подписью UserCallback (список альбомов) и т. д.

Это работает нормально, но теперь я хочу сделать универсальный InternalCallback.У меня много методов GetXXXX для реализации, и все они следуют одному и тому же шаблону.

Я хочу, чтобы у моего AsyncState был делегат, который обрабатывает ответ сервера, чтобы InternalCallback выглядел примерно так:

InternalCallback(httpStatusCode, responseBody, asyncState)
{
    var realState = asyncState as AsyncState<MAGICALLY-FIGURE-OUT-TYPE>.

    *Do generic work here*

     var listOfItems = asyncState.ProcessServerResponse(responseBody)

     realState.UserCallback(List<MAGIC-TYPE> listOfItems);
}

Так что это позволило бы мне прекратить повторять InternalCallback для каждого метода GetXXX (единственное, что меняет - это тип).

Но теперь у меня есть проблема, как выяснить типобъекта состояния в обратном вызове?До сих пор он явно объявлялся, т. Е. GetArtistsInternalCallback знает, что он работает с Artists, но если бы у меня был общий обратный вызов, как бы он определил тип?

EDIT: Кроме того, если есть какая-то разница, типы типов Artist и Album полученыобщий базовый класс MediaItem.

Cheers,

Tyler

1 Ответ

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

Трудно сказать по представленному псевдокоду, но есть ли какая-то причина, по которой вы не можете просто сделать InternalCallback универсальным методом и предоставить аргумент типа при создании экземпляра делегата обратного вызова?Метод может быть общим, хотя делегат не является.Вот пример:

using System;

class Test
{
    delegate void Callback(object o);

    static void Main()
    {
        Callback callback = ShowType<int>;
        callback(10);
    }

    static void ShowType<T>(object value)
    {
        Console.WriteLine("Value = " + value);
        Console.WriteLine("typeof(T) = " + typeof(T));
        Console.WriteLine("value.GetType() = " + value.GetType());
    }
}

Конечно, вы должны указать правильный тип при создании обратного вызова, но, похоже, это не будет проблемой в вашей ситуации.

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