2011-03-09 69 views
0

我在写一个通过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的公共基类派生。

干杯,

泰勒

回答

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()); 
    } 
} 

当然,你必须在创建回调指定正确的类型,但它听起来像是这不会是你的情况的问题。

+0

我可以......但InternalCallback委托实际上是我的HttpClient上的一个HttpResponseReceived委托 - 所以我宁愿不修改那些特定于这种情况的代码。 – Tyler 2011-03-09 09:34:37

+0

@Tyler:我不是建议你改变*委托*。我建议你改变用于创建委托实例的*方法*。 – 2011-03-09 09:38:02

+0

非常感谢你,我从来不知道你可以在特定的基础上为泛型添加泛型,即使委托不是泛型的。完美的作品:) – Tyler 2011-03-09 09:38:10