2012-04-01 8 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参照例外を作成します。それは、テキストを介して渡されたメソッドを呼び出す必要があります(テキストファイルから取得します)メソッド情報がnullを返している理由

解決済み:メソッドはプライベートです。

答えて

12

マンハッタンHはプライベートメソッドです。このメソッドをpublicにするか、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

この場合、type引数は必要ありません。実際の問題は、要求されたメソッドがプライベートであることです。 – 3Doubloons

+0

@AlexBraultはドキュメントが間違っていることを示唆していますか? – surfen

+1

私はちょうどタイプを省略しようとしていると言って、それは完全に動作します。なぜ私は少し混乱している、私は文書が私たちがそれらを渡す必要があることを示すようだと同意するので、 – 3Doubloons

1

GetMethodは自動的にその型のパブリックメンバーのみ検索します。あなたは、この行に代入して(プライベートメンバーを含む、検索を持っている)これを回避することができます:

MethodInfo HMethodInfo = this.GetType().GetMethod(Method, BindingFlags.Instance | BindingFlags.NonPublic); 
関連する問題