如何使用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
相关产品推荐
相关产品推荐

