Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反序列化列表<;T>;从运行时使用类型_C#_Json_.net - Fatal编程技术网

C# 反序列化列表<;T>;从运行时使用类型

C# 反序列化列表<;T>;从运行时使用类型,c#,json,.net,C#,Json,.net,我正在尝试从API反序列化响应,并在运行时检索类型: var modelType = Type.GetType($"Namespace.{itemname}").GetType(); 然后调用一个传递类型的泛型方法(使用refrection)。API调用后,我尝试将其反序列化为响应: var obj= await response.Content.ReadAs<List<T>>(); var obj=wait response.Content.Re

我正在尝试从API反序列化响应,并在运行时检索类型:

var modelType = Type.GetType($"Namespace.{itemname}").GetType();
然后调用一个传递类型的泛型方法(使用refrection)。API调用后,我尝试将其反序列化为响应:

var obj= await response.Content.ReadAs<List<T>>();
var obj=wait response.Content.ReadAs();
但它给出了这样一个错误:

无法将当前JSON对象(例如{“名称”:“值”})反序列化为类型“System.RuntimeType”,因为该类型需要一个JSON字符串值才能正确反序列化

我还尝试将其作为字符串读取,然后使用JsonConvert

var str = await response.Content.ReadAsStringAsync();
var obj = JsonConvert.DeserializeObject<List<T>>(str);
var str=wait response.Content.ReadAsStringAsync();
var obj=JsonConvert.DeserializeObject(str);

同样的错误。有人知道怎么做吗?谢谢

不能对运行时类型使用泛型。也就是说,存在采用类型参数的序列化/反序列化重载

在您的例子中,因为您有一个列表,其中T是一个运行时类型,所以您需要反射在运行时动态创建泛型类型,然后将其传递到第二个参数:

var listType = typeof(List<>);
var modelType = Type.GetType($"Namespace.{itemname}");
var str = await response.Content.ReadAsStringAsync();
var obj = JsonConvert.DeserializeObject(str, listType.MakeGenericType(modelType));
var listType=typeof(列表);
var modelType=Type.GetType($“Namespace.{itemname}”);
var str=await response.Content.ReadAsStringAsync();
var obj=JsonConvert.DeserializeObject(str,listType.MakeGenericType(modelType));

问题在于行
var modelType=Type.GetType($“Namespace.{itemname}”).GetType()

此代码按名称解析类型(
type.GetType($“Namespace.{itemname}”)
),但随后在此类型实例上调用方法
GetType
。这将为您提供实例的类型,这很容易混淆,
System.type
System.RuntimeType
,具体取决于框架版本


删除额外的
GetType()
应该可以解决问题。

您的问题中的
T
是什么?它从何而来?T始终是一个简单的类(我想使用T,因为我有很多),modelType变量是您的T吗?我认为
Type.GetType($“Namespace.{itemname}”).GetType()
是错误的:您解析类型,然后对类型为“RuntimeType”的实例调用“GetType”,这样您就得到了类似于类型的类型。您可能应该仔细检查该部分或发布更完整的示例?@a.Chiesa您是对的!现在开始工作了!谢谢!