RESTWebAPI:基于查询路径的JSON到C#对象

RESTWebAPI:基于查询路径的JSON到C#对象,c#,json,rest,api,marshalling,C#,Json,Rest,Api,Marshalling,我有一个查询RESTWebAPI的C#应用程序 查询返回JSON对象。我正在尝试(取消)将这些对象封送到C#。 我使用System.Text.Json库执行(取消)封送处理。 不同的查询路径返回不同类型的对象,我有一个字典,用于根据所使用的查询路径确定应该使用的数据类型 public static class ModelTypes { private static Dictionary<string, Type> all = new Dictionary<string,

我有一个查询RESTWebAPI的C#应用程序

查询返回JSON对象。我正在尝试(取消)将这些对象封送到C#。 我使用System.Text.Json库执行(取消)封送处理。 不同的查询路径返回不同类型的对象,我有一个字典,用于根据所使用的查询路径确定应该使用的数据类型

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;
    }
}
公共静态类模型类型
{
私有静态字典all=新字典()
{
{“成就”,类型(列表)}
};
公共静态类型GetTypeFromPath(字符串路径)
{
if(all.ContainsKey(path))返回所有[path];
否则返回null;
}
}
然后我有另一个类,它包含一个HttpClient对象名client。 我编写了一个函数,该函数执行对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);
}
公共异步任务获取(字符串路径)
{
Task streamTask=client.GetStreamAsync(路径);
返回await JsonSerializer.DeserializeAsync(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 ...
string path=“成就”;
Type Type=ModelTypes.GetTypeFromPath(路径);
if(type!=null)
{

var result=await api.Get(path);//我后来意识到,您正在尝试将字符串反序列化为您在类型中定义的类型

    public async Task<T> Get<T>(string path)
    {
        Task<Stream> streamTask = client.GetStreamAsync(path);
        return (T)await JsonSerializer.DeserializeAsync(await streamTask, typeof(T));
    }
公共异步任务获取(字符串路径)
{
Task streamTask=client.GetStreamAsync(路径);
return(T)await JsonSerializer.DeserializeAsync(await streamTask,typeof(T));
}

与将
T
定义为
TValue
DeserializeAsync
不同,您必须将
Type
作为参数传递给该方法。此外,由于该方法返回一个对象,因此您必须在return语句中将其转换为返回类型。

我后来意识到,您正在尝试对str进行反序列化正在初始化到您正在类型中定义的类型

    public async Task<T> Get<T>(string path)
    {
        Task<Stream> streamTask = client.GetStreamAsync(path);
        return (T)await JsonSerializer.DeserializeAsync(await streamTask, typeof(T));
    }
公共异步任务获取(字符串路径)
{
Task streamTask=client.GetStreamAsync(路径);
return(T)await JsonSerializer.DeserializeAsync(await streamTask,typeof(T));
}

不要将
T
定义为
TValue
DeserializeAsync
,而必须将
Type
作为参数传递给该方法。此外,由于该方法返回一个对象,因此必须在return语句中将其转换为返回类型。

是否尝试使用dynamic而不是typeInamic,它解决了调用Get(path)函数时的错误,但是JSON反序列化程序不知道应该反序列化到函数内部的类型。这正是我试图做的。但是它不允许我将“type”变量用作“TValue”,因为它是运行时变量,而不是硬编码的“type”。我想知道,如果我不能提供动态类型,只能提供硬编码静态类型,那么泛型的意义何在。也许这是不可能的,我不确定…与其反序列化到某个泛型参数类型,不如使用非泛型重载并传入类型。您是否尝试过使用dynamic而不是typeI?我尝试过使用dynamic,这解决了调用Get(path)函数时出现的错误,但是JSON反序列化程序不知道应该反序列化到函数内部的类型。这正是我要做的。但是,它不允许我将“type”变量用作“TValue”,因为它是运行时变量,而不是硬编码的“type”。我想知道,如果我不能提供动态类型,只能提供硬编码静态类型,那么泛型的意义何在。也许这是不可能的,我不确定…与其反序列化到某个泛型参数类型,不如使用非泛型重载并传入类型。