C# 反序列化列表<;T>;从运行时使用类型
我正在尝试从API反序列化响应,并在运行时检索类型: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
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您是对的!现在开始工作了!谢谢!