如何将对象转换为未知的泛型类型?
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);
}
我想构建一个通用方法来调用许多 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);
}