调用动态类型的非静态泛型方法
问题描述:
我想调用一个在运行时确定类型的泛型方法。此电话: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);
}
}
答
的JObject
的Value()
方法需要一个关键的参数,但是你没有指定参数,所以无法找到0参数的方法,并抛出异常。
答
JToken.Value
需要一个参数:值的关键。所以,你会怎么做:
var value = genericMethod.Invoke(jToken, new[] { valuePair.Key });
+0
谢谢你的帮助。但它需要'Invoke(obj,new [] {valuePair.Key});'否则它会抛出“无法访问Newtonsoft.Json.Linq.JValue上的子值”。如果调用fx'jToken.Value
哎呀,我简直不敢相信我错过了... –
好这里是一个奇怪的一个。如果我在'jToken'声明之后放置了一个断点,并且在立即窗口中键入:'jToken.Value()',那么我会得到预期的结果。如果我把'jToken.Value (“someKey”)',那么它会失败,并且“无法访问Newtonsoft.Json.Linq.JValue上的子值” –
@Snæbjørn这是有原因的。 JToken类有一个名为“Value”的方法,其中包含一个参数,即键。但是,对于JToken实例,有扩展方法,其中一个值为(),这是您在中间窗口中调用的方法,而不是JToken类的Value方法。该方法甚至不存在于JToken中,它不属于那里,它是一种静态方法。对于使用此方法的编译器与编写'StaticExtensionClass.Value (jToken)' –
frikinside