如何在.NET中根据动态获取的类型调用泛型反序列化方法?
解决方案
问题原因
你报错是因为泛型方法的类型参数<T>要求是编译时确定的静态类型,而instance是运行时生成的变量,无法作为泛型参数传入。
方法一:添加非泛型反序列化重载(推荐)
直接利用Newtonsoft.Json原生的DeserializeObject(string, Type)方法,给你的序列化类新增一个非泛型重载:
// 在你的序列化类中新增方法 public object Deserialize(string value, Type targetType) { var result = JsonConvert.DeserializeObject(value, targetType); return result ?? throw new NullReferenceException("反序列化结果为空"); }
然后在HandleMessage中直接调用这个重载:
private bool HandleMessage(string content) { var targetType = _serialization.GetDistributionType(); var deserializedObject = _serialization.Deserialize(content, targetType); // 后续可以通过类型判断处理不同DTO if (deserializedObject is BeerDTO beerDto) { // 处理啤酒DTO的业务逻辑 } else if (deserializedObject is WineDTO wineDto) { // 处理葡萄酒DTO的业务逻辑 } // rest of code return true; }
方法二:通过反射调用泛型方法(不推荐,代码冗余)
如果一定要用现有的泛型Deserialize<T>方法,可以通过反射动态构造泛型方法并调用:
private bool HandleMessage(string content) { var targetType = _serialization.GetDistributionType(); // 获取泛型方法的定义 var deserializeMethod = typeof(YourSerializationClass) .GetMethod(nameof(YourSerializationClass.Deserialize))!; // 构造指定类型的泛型方法实例 var genericDeserializeMethod = deserializeMethod.MakeGenericMethod(targetType); // 调用方法并获取结果 var deserializedObject = genericDeserializeMethod.Invoke(_serialization, new object[] { content }); // rest of code return true; }
注意:将
YourSerializationClass替换为你的序列化类的实际名称。
内容的提问来源于stack exchange,提问作者Proliges
相关产品推荐
相关产品推荐

