我正在编写一个通过HTTP与JsonRpc服务通信的库。所有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
}
现在异步状态是通用的,所以如果我有一个名为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);
}
因此,这将允许我停止为每个GetXXX方法重复InternalCallback(只有更改的是类型)。
但我现在遇到的问题是如何计算回调中状态对象的类型?到目前为止,它已明确声明,即GetArtistsInternalCallback知道它正在与艺术家合作,但如果我有一个通用的回调,它将如何找出类型?
编辑:如果它有任何区别,艺术家和专辑类型都是从名为MediaItem的公共基类派生的。
干杯,
泰勒
答案 0 :(得分:1)
很难从有些伪代码中看出来,但有没有理由你不能只使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());
}
}
当然,您必须在创建回调时指定正确的类型,但听起来这在您的情况下不会出现问题。