2

Reflection 初心者からの質問です。Windowsフォームにメソッドがあります:

private void handleOrderCode()
{
  //...do stuff
}

次の方法で呼び出そうとしています:

Type t = this.GetType();
MethodInfo mi = t.GetMethod("handleOrderCode");
if (mi != null) mi.Invoke(this, null);

「this」が null でないことを確認しました。文字列「handleOrderCode」がハードコーディングされているスペースは、これが機能するときに文字列変数に置き換えられます。ただし、現時点では、最終行の if 文で評価されると、「mi」は常に null になります。

それで、私は何を間違っていますか?

4

3 に答える 3

10

バインディング フラグを指定する必要があります。

using System.Reflection;

t.GetMethod("handleOrderCode", BindingFlags.Instance | BindingFlags.NonPublic)

フラグのないオーバーロードは、次のことを意味するためです。

BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance

つまり、非パブリック (プライベート、保護など) のメンバーは返されません。

于 2011-04-18T11:17:52.953 に答える
5

パラメーターなしのオーバーロードはType.GetMethod、パブリック メソッドのみを検索します。

指定された名前のパブリック メソッドを検索します。

代わりに、別のオーバーロードBindingFlagsに適切な値を指定する必要があります。

MethodInfo method = t.GetMethod("handleOrderCode",
                                BindingFlags.Instance | BindingFlags.NonPublic);

ここでは、「非パブリック」だけでなく、「インスタンス」または「静的」(またはその両方) を指定する必要があることに注意してください。パブリック メソッドも探したい場合は、それも含める必要があります。

もう1つの方法は、メソッドを公開することです:)

HandleOrderCode(さらに、より慣用的で慣用的な C# に名前を変更することをお勧めします。)

于 2011-04-18T11:18:11.880 に答える
4

試す:

Type t = this.GetType();
MethodInfo mi = t.GetMethod("handleOrderCode", 
   BindingFlags.NonPublic | BindingFlags.Instance);
if (mi != null) mi.Invoke(this, null);
于 2011-04-18T11:18:56.747 に答える