You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Newtonsoft.Json动态反序列化JSON为C#对象并适配泛型方法

解决方案

1 动态反序列化JSON到匹配模型

泛型参数<T>需要在编译期确定,运行时动态指定类型可以用Newtonsoft.Json提供的非泛型反序列化重载,先判断JSON属性匹配对应模型类型:

// 先定义你的模型类
public class ModelA
{
    public string FirstName { get; set; }
}
public class ModelB
{
    public int DepartmentId { get; set; }
}

反序列化逻辑:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

// 输入的JSON字符串
string inputJson = "{\"FirstName\":\"John\"}";
JObject jObj = JObject.Parse(inputJson);
Type targetType = null;
object model = null;

// 根据JSON包含的属性匹配目标类型
if (jObj.ContainsKey(nameof(ModelA.FirstName)))
{
    targetType = typeof(ModelA);
    model = JsonConvert.DeserializeObject<ModelA>(inputJson);
}
else if (jObj.ContainsKey(nameof(ModelB.DepartmentId)))
{
    targetType = typeof(ModelB);
    model = JsonConvert.DeserializeObject<ModelB>(inputJson);
}

// 也可以直接用非泛型重载简化代码
// model = JsonConvert.DeserializeObject(inputJson, targetType);

这里也可以通过自定义JsonConverter实现更复杂的类型匹配逻辑,适合类型较多的场景

2 动态调用泛型仓储的Add方法

你遇到的type is variable but is used like type错误,是因为泛型的类型参数不能直接传入运行时的Type变量,有两种可行方案:

方案1:类型判断分支(推荐,无反射开销、稳定性高)

适合目标类型数量不多的场景:

if (model is ModelA modelA)
{
    _unitOfWork.Repository<ModelA>().Add(modelA);
}
else if (model is ModelB modelB)
{
    _unitOfWork.Repository<ModelB>().Add(modelB);
}
// 后续新增类型只需要加对应分支即可

方案2:反射动态调用

适合目标类型较多、需要灵活扩展的场景:

// 构造泛型仓储方法
var repoMethod = _unitOfWork.GetType().GetMethod("Repository").MakeGenericMethod(targetType);
var repoInstance = repoMethod.Invoke(_unitOfWork, null);
// 调用Add方法
var addMethod = repoInstance.GetType().GetMethod("Add", new Type[] { targetType });
addMethod.Invoke(repoInstance, new object[] { model });

内容的提问来源于stack exchange,提问作者Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:27:04