使用C#中的反射反序列化Json

Hes*_*efi 2 c# reflection json json.net deserialization

我想使用以下方法使用Newtonsoft.Json进行反射:

MyType object = JsonConvert.DeserializeObject<MyType>(jsonString);
Run Code Online (Sandbox Code Playgroud)

这是我的方法不起作用(模糊匹配异常):

Type type = Type.GetType("MyType",false);
Type JSONCovert = typeof(JsonConvert);
MethodInfo deserializer = JSONCovert.GetMethod("DeserializeObject", new Type[] { typeof(String) });
deserializer = deserializer.MakeGenericMethod(type);
var o = deserializer.Invoke(null, new object[] { JsonString });
Run Code Online (Sandbox Code Playgroud)

kiz*_*ziu 9

您将获得不明确的匹配异常,因为有两种方法JsonConvert,它们与您提供的名称和参数类型相匹配.那些是:

  • public static object DeserializeObject(string value)
  • public static T DeserializeObject<T>(string value)

您必须更具体地选择正确的方法.不幸的是,你将无法使用GetMethod- 而是你必须扫描方法列表并使用正确的方法.你可以这样做:

    var JSONCovert = typeof(JsonConvert);
    var parameterTypes = new[] { typeof(string) };
    var deserializer = JSONCovert.GetMethods(BindingFlags.Public | BindingFlags.Static)
        .Where(i => i.Name.Equals("DeserializeObject", StringComparison.InvariantCulture))
        .Where(i => i.IsGenericMethod)
        .Where(i => i.GetParameters().Select(a => a.ParameterType).SequenceEqual(parameterTypes))
        .Single();
Run Code Online (Sandbox Code Playgroud)

编辑:我可以澄清的另一件事是:记住你的方法将导致o类型object.您将无法MyType在编译时将其强制转换.