首页 > 解决方案 > 无法反序列化 int List其中类型在运行时确定

问题描述

我有一个场景应该非常简单,但事实并非如此!

我有一个在运行时确定的类型

我想打电话

JSonConvert.DeserialiseObject<List<type>>(json);

通过 Make Generic Method 因为我需要在运行时确定类型

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>);

并且 entityType 无法解析

我究竟做错了什么?抱歉,我发现泛型真的很令人沮丧!

我的理想选择是能够获取对象列表并将其转换为所需类型的列表,但我无法让它以通用方式工作,因此不得不尝试这个

干杯

保罗

标签: c#jsongenericsreflection

解决方案


这个:

.MakeGenericMethod(requiredType)

改成:

.MakeGenericMethod(typeof(List<>).MakeGenericType(requiredType))

更具可读性:

var listType = typeof(List<>).MakeGenericType(requiredType);

接着

...
.MakeGenericMethod(listType)

推荐阅读