我想构建一个通用方法来调用许多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接口。 有人可以帮忙吗?
谢谢,
大卫
答案 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()