在Async回调中获取泛型类型

时间:2011-03-09 09:16:17

标签: c# .net generics windows-phone-7 asynchronous

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

干杯,

泰勒

1 个答案:

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

当然,您必须在创建回调时指定正确的类型,但听起来这在您的情况下不会出现问题。