使用Json.Net反序列化时,在运行时将System.Type用作

我有一个进程需要能够以下面的方式调用函数。

public static Task Convert(string payload, Type type) { JsonSerializerSettings settings = new JsonSerializerSettings().Configure();//<--- Pull in extension methods to handle custom types return JsonConvert.SerializeObject(JsonConvert.DeserializeObject(payload), settings)); } 

上面的代码不能编译。 接下来,我使用John Skeet对2011年类似于我的问题的回答 。

 public static string Convert(string payload, Type type) { JsonSerializerSettings settings = new JsonSerializerSettings().Configure(); //This clashes with another overload of DeserializeObject in the method table MethodInfo method = typeof(JsonConvert).GetMethod("DeserializeObject", new[] { typeof(string) }); method = method.MakeGenericMethod(type); object[] arguments = new object[1]; arguments[0] = payload; string result = (string)method.Invoke(null, arguments); return JsonConvert.SerializeObject(result, settings); } 

存在重载非generics和具有相同名称的generics重载,并且方法表查找失败。 通过调用类似于下面的函数(非模糊),我能够解决这个问题。

 public static string Convert(string payload, Type type) { JsonSerializerSettings settings = new JsonSerializerSettings().Configure(); //This clashes with another overload of DeserializeObject in the method table MethodInfo method = typeof(TestConverter).GetMethod("TestThis", new[] { typeof(string) }); method = method.MakeGenericMethod(type); object[] arguments = new object[1]; arguments[0] = payload; string result = (string)method.Invoke(null, arguments); return JsonConvert.SerializeObject(result, settings); } public static T TestThis(string s) { return JsonConvert.DeserializeObject(s); } 

但是,我现在回到我的自定义转换扩展方法被忽略的地方,因为反序列化器忽略了我的Type类型。

这是否可能。 当然我可以使用类似于的反序列化版本:

 object result = JsonConvert.DeserializeObject(payload); 

但是,我的练习是使用JsonConvert.DeserializeObject(payload)重载,以便可以调用我的转换器。

有小费吗?

你不需要跳过篮球。 JsonConvert.DeserializeObject具有接受Type的非generics重载 。

 public static Task Convert(string payload, Type type) { JsonSerializerSettings settings = new JsonSerializerSettings().Configure();//<--- Pull in extension methods to handle custom types return JsonConvert.SerializeObject(JsonConvert.DeserializeObject(payload, type), settings)); }