2016-09-29 31 views
1

我想用Newtonsoft.Json使用下面的方法与反思:的JSON反序列化使用C#反射

MyType object = JsonConvert.DeserializeObject<MyType>(jsonString); 

这是我的方法不工作(含糊的比赛除外):

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 }); 
+0

请提供完整的Exceptiondetails。 – CSharpie

+0

你在问什么?因为现在,不清楚你期望什么 –

+0

'MyType'是什么,'jsonString'是怎么样的? –

回答

5

您会得到模糊匹配异常,因为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(); 

编辑:还有一件事我可以明确的是:记住,你的做法会导致o之中object型。您将无法在编译时将其转换为MyType

+0

好奇为什么有人低调,因为这是一个正确的答案。如果有人评论他们发现不正确或无用的东西,这将非常有用。 – kiziu

+0

为什么这会降低投票率? – CSharpie