2014-03-13 46 views
0

我想调用一个在运行时确定类型的泛型方法。此电话:Type type = ...; jToken.Value.Value<type>();JToken对象上。调用动态类型的非静态泛型方法

我来到这里了,我相信我快到了。但是在拨打Invoke时,我收到了“参数计数不匹配”异常。我无法弄清楚为什么。

public void Foo(JObject obj, Type type) 
{ 
    foreach (var valuePair in obj) 
    { 
     JToken jToken = valuePair.Value; 
     var genericMethod = jToken.GetType().GetMethod("Value").MakeGenericMethod(new Type[] {type}); 
     // should call jToken.Value<type>() 
     var value = genericMethod.Invoke(jToken, null); 
    } 
} 

回答

1

JObjectValue()方法需要一个关键的参数,但是你没有指定参数,所以无法找到0参数的方法,并抛出异常。

+0

哎呀,我简直不敢相信我错过了... –

+0

好这里是一个奇怪的一个。如果我在'jToken'声明之后放置了一个断点,并且在立即窗口中键入:'jToken.Value ()',那么我会得到预期的结果。如果我把'jToken.Value (“someKey”)',那么它会失败,并且“无法访问Newtonsoft.Json.Linq.JValue上的子值” –

+1

@Snæbjørn这是有原因的。 JToken类有一个名为“Value”的方法,其中包含一个参数,即键。但是,对于JToken实例,有扩展方法,其中一个值为(),这是您在中间窗口中调用的方法,而不是JToken类的Value方法。该方法甚至不存在于JToken中,它不属于那里,它是一种静态方法。对于使用此方法的编译器与编写'StaticExtensionClass.Value (jToken)' – frikinside

1

JToken.Value需要一个参数:值的关键。所以,你会怎么做:

var value = genericMethod.Invoke(jToken, new[] { valuePair.Key }); 
+0

谢谢你的帮助。但它需要'Invoke(obj,new [] {valuePair.Key});'否则它会抛出“无法访问Newtonsoft.Json.Linq.JValue上的子值”。如果调用fx'jToken.Value ()'它不需要参数,但反射引擎似乎没有找到它,似乎有一个方法需要0参数。因此,我需要调用'obj.Value (“keyname”)' –