无法反序列化 int List<type>,其中类型在运行时确定
Cannot deserialize int List<type> where type is determined t runtime
我有一个应该非常简单的场景,但事实并非如此!
我有一个在运行时确定的类型
我要打电话
JSonConvert.DeserialiseObject<List<type>>(json);
通过生成通用方法,因为我需要在运行时确定类型
var entityTypes = _dbContext.Model.GetEntityTypes();
foreach (var entityType in entityTypes)
{
var requiredType = entityType.ClrType;
var testMethod = typeof(JsonConvert).GetMethods().FirstOrDefault(
x => x.Name.Equals("DeserializeObject", StringComparison.OrdinalIgnoreCase) &&
x.IsGenericMethod && x.GetParameters().Length == 1)
?.MakeGenericMethod(requiredType);
var filename = $"my json.json";
var json = File.ReadAllText(filename);
var actualData2 = testMethod?.Invoke(null, new object[] { json });
}
如果我的 json 用于单个对象
,这将非常有效
然而,事实并非如此,我的 json 是一个列表,显然上面的代码不会工作,因为它期望我的 json 是一个单一的对象
所以我试着改成
var requiredType = typeof(List<entityType.ClrType>);
实体类型无法解析
我做错了什么?抱歉,我发现泛型真的很令人沮丧!
我的理想选择是能够获取对象列表并将其转换为所需类型的列表,但我无法以通用方式使用它,因此不得不尝试这个
干杯
保罗
这个:
.MakeGenericMethod(requiredType)
更改为:
.MakeGenericMethod(typeof(List<>).MakeGenericType(requiredType))
更具可读性:
var listType = typeof(List<>).MakeGenericType(requiredType);
然后
...
.MakeGenericMethod(listType)
我有一个应该非常简单的场景,但事实并非如此!
我有一个在运行时确定的类型
我要打电话
JSonConvert.DeserialiseObject<List<type>>(json);
通过生成通用方法,因为我需要在运行时确定类型
var entityTypes = _dbContext.Model.GetEntityTypes();
foreach (var entityType in entityTypes)
{
var requiredType = entityType.ClrType;
var testMethod = typeof(JsonConvert).GetMethods().FirstOrDefault(
x => x.Name.Equals("DeserializeObject", StringComparison.OrdinalIgnoreCase) &&
x.IsGenericMethod && x.GetParameters().Length == 1)
?.MakeGenericMethod(requiredType);
var filename = $"my json.json";
var json = File.ReadAllText(filename);
var actualData2 = testMethod?.Invoke(null, new object[] { json });
}
如果我的 json 用于单个对象
,这将非常有效然而,事实并非如此,我的 json 是一个列表,显然上面的代码不会工作,因为它期望我的 json 是一个单一的对象
所以我试着改成
var requiredType = typeof(List<entityType.ClrType>);
实体类型无法解析
我做错了什么?抱歉,我发现泛型真的很令人沮丧!
我的理想选择是能够获取对象列表并将其转换为所需类型的列表,但我无法以通用方式使用它,因此不得不尝试这个
干杯
保罗
这个:
.MakeGenericMethod(requiredType)
更改为:
.MakeGenericMethod(typeof(List<>).MakeGenericType(requiredType))
更具可读性:
var listType = typeof(List<>).MakeGenericType(requiredType);
然后
...
.MakeGenericMethod(listType)