2012-04-01 3 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. Создает исключение нулевой ссылки. Он должен вызывать метод, переданный через текст (который схвачен из текстового файла)Метод Info возвращает значение null, неопределенное, почему

Решено: методы являются частными.

ответ

12

ManhattanH - частный метод. Сделайте этот метод общедоступным или используйте BindingFlags.NonPublic.

+5

Не забывайте, что если вы вручную дать 'GetMethod' обязательные флаги, вам необходимо включить' BindingFlags.Instance | BindingFlags.NonPublic', а не только 'BindingFlags.NonPublic'. – aboveyou00

0

Type.GetMethod Method (String, Type[])

Поиск имя чувствительно к регистру. Поиск включает общедоступные статические и общедоступные методы экземпляра.

Вы не можете опускать параметры при поиске конструкторов и методов. Вы можете только опускать параметры при вызове.

Изменить способ общественного и попробовать это:

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);