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

时间:2015-10-14 17:52:27

标签: c# asp.net-mvc webclient

我想构建一个通用方法来调用许多Web API,比如Bing Maps。对于这个问题,我使用了来自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);
        }

现在我收到此错误: 类型参数&#39; TDataContract&#39;不能用于&#39; as&#39;运算符,因为它没有类类型约束,也没有&#39;类&#39;约束基础设施

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

谢谢,

大卫

2 个答案:

答案 0 :(得分:2)

在进行回调时我会做一个类型的实际演员,当你用序列化器读取对象时,不需要转换类型:

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

答案 1 :(得分:1)

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

where TDataContract : IDataContract, class, new()