如何将对象转换为未知的泛型类型?

How to cast an object to a not known generic type?

我想构建一个通用方法来调用许多 Web API,例如 Bing 地图。对于这个问题,我使用 class from : Problem with deserializing JSON on datamember "__type" 效果很好。

我不完全知道如何将 ser.ReadObject(a.Result) 转换为我作为通用参数给出的类型,在本例中为 LocationQueryResponse.

public static void GetResponse<TDataContract>(Uri uri, Action<TDataContract> callback)
            where TDataContract : IDataContract, new()
        {
            var contract = new TDataContract();
            var contractType = contract.GetType();

            var wc = new WebClient();
            wc.OpenReadCompleted += (o, a) =>
            {
                if (callback != null)
                {
                    var ser = new DataContractJsonSerializer(typeof(TDataContract));
                    callback(Convert.ChangeType(ser.ReadObject(a.Result), contractType));
                }
            };

            wc.OpenReadAsync(uri);
        }

现在我得到这个错误: 类型参数 'TDataContract' 不能与 'as' 运算符一起使用,因为它没有 class 类型约束,也没有 'class' 约束 Infrastructure

每个与 Web API 通信的 class 继承 IDataContract 接口。 有人可以帮忙吗?

谢谢,

大卫

尝试将 class 添加到您的 where 指令中:

where TDataContract : IDataContract, class, new()

我会在进行回调时进行类型的实际转换,不需要转换类型,因为您已经使用序列化程序读取了对象:

public static void GetResponse<TDataContract>(Uri uri, Action<TDataContract> callback)
            where TDataContract : IDataContract, class, new()
{
    var contract = new TDataContract();
    var contractType = contract.GetType();

    var wc = new System.Net.WebClient();
    wc.OpenReadCompleted += (o, a) =>
    {
        if (callback != null)
        {
            var ser = new DataContractJsonSerializer(typeof(TDataContract));
            var obj = ser.ReadObject(a.Result);
            callback((TDataContract)obj);
        }
    };

    wc.OpenReadAsync(uri);
}