我有一个查询REST Web API的C#应用程序。
查询返回JSON对象。我试图将这些对象编组(解组)到C#。我使用System.Text.Json库执行(取消)编组。不同的查询路径返回不同类型的对象,并且我有一个Dictionary,用于根据所使用的查询路径来确定我们应该期望的数据类型。
public static class ModelTypes
{
private static Dictionary<string, Type> all = new Dictionary<string, Type>()
{
{ "achievements", typeof(List<Achievement>) }
};
public static Type GetTypeFromPath(string path)
{
if (all.ContainsKey(path)) return all[path];
else return null;
}
}
然后,我还有另一个包含HttpClient对象名称客户端的类。我编写了一个函数,该函数对API执行标准的GET请求,并返回调用该函数时指定的T类型的C#对象。
public async Task<T> Get<T>(string path)
{
Task<Stream> streamTask = client.GetStreamAsync(path);
return await JsonSerializer.DeserializeAsync<T>(await streamTask);
}
然后在应用程序中,我想实际调用此函数,但是我似乎无法用GetTypeFromPath()函数返回的类型代替T。
string path = "achievements";
Type type = ModelTypes.GetTypeFromPath(path);
if (type != null)
{
var result = await api.Get<type>(path); // <--- Red squiggly under "type"
}
else ...
例如,如果我使用某种类型的硬编码:
var result = await api.Get<List<Achievement>>(path);
foreach (Achievement achievement in result)
{
Console.WriteLine(achievement.Name);
}
一切正常,控制台将为列表中的每个成就打印出名称。
关于如何简单地使用通用Get(字符串路径)的任何建议?相对于硬编码,如何动态指定T是什么?也许有更好的方法可以完成...
我后来意识到,您试图将字符串反序列化为您在Type中定义的类型。
public async Task<T> Get<T>(string path)
{
Task<Stream> streamTask = client.GetStreamAsync(path);
return (T)await JsonSerializer.DeserializeAsync(await streamTask, typeof(T));
}
而不是将T
定义为TValue
至DeserializeAsync
,您必须将Type
作为参数传递给该方法。另外,由于该方法返回一个对象,因此您还必须在return语句中将其强制转换为return Type。