2012-04-01 1 views
2
sealed public class HMethod 
{ 
    public int Calc(string Method, int X1, int X2, int Y1, int Y2) 
    { 
     MethodInfo HMethodInfo = this.GetType().GetMethod(Method); 
     return (int)HMethodInfo.Invoke(
      this, 
      new object[4] { X1, X2, Y1, Y2 } 
      ); 
    } 
    int ManhattanH(int X1, int X2, int Y1, int Y2) 
    { 
     //Blah 
    } 
    int LineH(int X1, int X2, int Y1, int Y2) 
    { 
     //Blah 
    } 
    //Other Heuristics 
} 

new HMethod().Calc("ManhattanH". X1, X2, Y1, Y2)으로 전화 할 때 HMethodInfo가 null입니다. null 참조 Exception를 작성합니다. 텍스트를 통해 전달 된 메서드를 호출해야합니다 (텍스트 파일에서 가져온 것임)메서드 정보가 null을 반환하는 이유는 무엇입니까

해결 방법 : 메서드는 private입니다.

답변

12

맨해튼 H는 개인적인 방법입니다. 이 메서드를 public으로 설정하거나 BindingFlags.NonPublic을 사용합니다.

+5

당신이 수동으로'BindingFlags.Instance을 포함해야'GetMethod' 바인딩 플래그를 주면, 잊지 마세요 | BindingFlags.NonPublic'이 아니라'BindingFlags.NonPublic'입니다. – aboveyou00

0

Type.GetMethod Method (String, Type[])

이름에 대한 검색은 대소 문자를 구분합니다. 검색에는 public static 및 public 인스턴스 메소드가 포함됩니다.

생성자 및 메서드를 찾을 때 매개 변수를 생략 할 수 없습니다. 호출 할 때 매개 변수 만 생략 할 수 있습니다.

는 대중에게 당신의 방법을 변경하고 이것을 시도

:

MethodInfo HMethodInfo = this.GetType().GetMethod(Method, 
    new Type[]{typeof(int), typeof(int), typeof(int), typeof(int)}); 
+0

이 경우 형식 인수가 필요하지 않습니다. 실제 문제는 요청한 메소드가 개인 – 3Doubloons

+0

@AlexBrault인데 문서가 잘못되었다고 제안하는 것입니까? – surfen

+1

방금 ​​형식을 생략하고 완벽하게 작동한다고 말하고 있습니다. 나는 문서가 우리가 그들을 전달할 필요가있다는 것을 나타내는 것으로 보인다는 것에 동의하기 때문에 나는 약간 왜 혼란 스럽다. – 3Doubloons

1

GetMethod가 자동으로 해당 유형의 공용 멤버 만 검색합니다. 당신이 줄을 대체하여이 문제를 해결 수 (및 검색이 개인 구성원을 포함해야) 할 수 있습니다

MethodInfo HMethodInfo = this.GetType().GetMethod(Method, BindingFlags.Instance | BindingFlags.NonPublic);