Я пишу библиотеку, которая связывается со службой 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