我在写一个通过HTTP与JsonRpc服务进行通信的库。所有HTTP操作都是按设计异步完成的。在Async回调中获取泛型类型
发送到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
}
现在异步状态是通用的,所以如果我有一个方法叫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知道它与艺术家合作,但如果我有一个通用的回调,它会如何找出类型?
编辑:此外,如果它使任何区别艺术家和专辑类型是从一个名为MediaItem的公共基类派生。
干杯,
泰勒
我可以......但InternalCallback委托实际上是我的HttpClient上的一个HttpResponseReceived委托 - 所以我宁愿不修改那些特定于这种情况的代码。 – Tyler 2011-03-09 09:34:37
@Tyler:我不是建议你改变*委托*。我建议你改变用于创建委托实例的*方法*。 – 2011-03-09 09:38:02
非常感谢你,我从来不知道你可以在特定的基础上为泛型添加泛型,即使委托不是泛型的。完美的作品:) – Tyler 2011-03-09 09:38:10