2010-07-08 3 views
1

URI 및 메서드 이름이있는 매개 변수로 개체를 받아들이는 WCF 서비스가 있습니다. 내가하려고하는 것은 URI가 "localhost"라는 단어를 포함하는 경우 URI를 찾는 방법입니다. 리플렉션을 사용하고 동일한 메서드 내에서 매개 변수로 전달 된 이름의 메서드를 호출합니다. 클래스에서 값을 반환하고 계속하십시오.동일한 클래스 내에서 Reflection to Invoke 메서드를 사용하려고 시도했습니다.

public class Test 
{ 
    public GetStatResponse GetStat(GetStatRequest request) 
    { 

     GetStatResponse returnValue = new GetStatResponse(); 

     if(Helpers.Contains(request.ServiceURI,"localhost", StringComparison.OrdinalIgnoreCase)) 
     { 
      MethodInfo mi = this.GetType().GetMethod(request.ServiceMethod /*, BindingFlags.Public | BindingFlags.IgnoreCase*/); 
      returnValue = (GetStatResponse)mi.Invoke(this,null); 
     } 

위의 내용은이 질문과 관련된 코드 세그먼트입니다. MethodInfo는 아무런 문제가 없지만 mi.Invoke에 문제가 있습니다. 내가받는 예외는 "호출 대상에 의해 예외가 발생했습니다."입니다. 내부 예외 "개체 참조가 개체의 인스턴스로 설정되지 않았습니다". 나는 행운과 함께 (GetStatResponse) mi.Invoke (new Test(), null)로 코드를 변경해 보았습니다. 시험은 수업입니다.

이 문제를 해결하는 방법에 대한 다른 제안이 열려 있습니다. 반사가 가장 쉽다고 생각했습니다.

내 테스트를 호출 오전 방법은 반사를 통해 당기는하는 MethodInfo가 null가 아닌 것을 확실하게 할 수 있습니다 메서드를 호출하기 전에

public GetStatResponse TestMethod() 
{ 
     GetStatResponse returnValue = new GetStatResponse(); 
     Stat stat = new Stat(); 
     Stat.Label = "This is my label"; 
     Stat.ToolTip = "This is my tooltip"; 
     Stat.Value = "this is my value"; 

     returnValue.Stat = stat; 
     return returnValue; 
} 
+0

대상 메서드에 매개 변수가 필요합니까? –

+0

대상 메서드에 매개 변수가 없습니다. –

답변

0

다음과 같이 정의된다

MethodInfo mi = this.GetType().GetMethod(
    request.ServiceMethod, 
    BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase 
); 

// Make sure that the method exists before trying to call it 
if (mi != null) 
{ 
    returnValue = (GetStatResponse)mi.Invoke(this, null); 
} 

업데이트 후 호출중인 메서드 내에서 예외가 throw 된 것으로 보입니다.

GetStatResponse returnValue = new GetStatResponse(); 
// Don't forget to initialize returnValue.Stat before using it: 
returnValue.Stat = new WhateverTheTypeIs(); 
returnValue.Stat.Label = "This is my label"; 
+0

감사합니다. 내 테스트에서는 메서드를 지정하고 MethodInfo를 올바르게 검색하고 있습니다. –

+0

이 예외가 발생하는 정확한 행을 찾으십시오. 방법 자체 안에있을 수 있을까요? –

+0

예외가 발생하는 정확한 줄은 returnValue = (GetStatResponse) mi.Invoke (this, null)입니다. 이제 호출하는 메서드가 원래 게시물에 정의되어 있습니다. –

0

GetMethod() 호출에서 BindingFlags를 지정하지 않으므로 PUBLIC 인 request.ServiceMethod를 포함하는 이름과 일치하는 메서드 만 반환됩니다.

호출하려는 메소드가 public인지 확인하십시오. 그렇지 않으면 MethodInfo가 null을 리턴합니다.

public이 아닌 경우 메서드를 public으로 설정하거나 BindingFlags.NonPublic 플래그를 포함시킵니다.

또한 mi.Invoke를 호출하기 전에 mi! = null인지 확인해야합니다.

+0

전화하는 방법은 공개입니다. 나는 거기에 BindingFlags를 가지고 있으며, 나는 그것들을 주석 처리했다. 주석 처리를 제거하면 여전히 동일한 결과가 산출됩니다. –

관련 문제