2014-03-13 41 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」)' –