2014-03-13 2 views
0

런타임시 detemirned 유형의 일반 메소드를 호출하려고합니다. 이 전화는 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 ()을 호출하면 매개 변수를 필요로하지 않지만 리플렉션 엔진은 매개 변수를 찾지 못하는 메서드가있는 것 같습니다. 그래서 대신에'obj.Value ("keyname")' –