3
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
}

When calling new HMethod().Calc("ManhattanH". X1, X2, Y1, Y2) HMethodInfo is null. Creates a null reference Exception. It should call the Method passed in via text (Which is grabbed from a text file)

Resolved: Methods are private.

4

3 回答 3

13

ManhattanH 是私有方法。将此方法设为公共或使用 BindingFlags.NonPublic。

于 2012-04-01T03:03:00.930 回答
1

GetMethod仅自动搜索该类型的公共成员。您可以通过替换此行来解决此问题(并让搜索包括私人成员):

MethodInfo HMethodInfo = this.GetType().GetMethod(Method, BindingFlags.Instance | BindingFlags.NonPublic);
于 2012-04-01T03:07:11.723 回答
0

Type.GetMethod 方法(字符串,Type[])

名称搜索区分大小写。搜索包括公共静态和公共实例方法。

查找构造函数和方法时不能省略参数。调用时只能省略参数。

将您的方法更改为公开并尝试以下操作:

MethodInfo HMethodInfo = this.GetType().GetMethod(Method,
    new Type[]{typeof(int), typeof(int), typeof(int), typeof(int)});
于 2012-04-01T03:03:32.890 回答