Почему я не могу вызвать этот метод через строку? - PullRequest
2 голосов
/ 18 апреля 2011

Вопрос от новичка Reflection.У меня есть метод в форме Windows:

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

, который я пытаюсь вызвать следующим образом:

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

Я подтвердил, что «this» не является нулевым.Пространство, где строка «handleOrderCode» была жестко закодирована, должно быть заменено строковой переменной, когда это работает.Однако в настоящее время «mi» всегда равно нулю, когда оно вычисляется в операторе if в последней строке.

Так что же я делаю не так?

Ответы [ 3 ]

10 голосов
/ 18 апреля 2011

Вам необходимо указать флаги привязки:

using System.Reflection;

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

Поскольку перегрузка без какого-либо флага означает:

BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance

, т.е. не будет возвращать никакие непубличные (частные, защищенныеи т. д.) членов.

5 голосов
/ 18 апреля 2011

Перегрузка без параметров Type.GetMethod ищет только открытые методы:

Ищет открытый метод с указанным именем.

Вам необходимо указать соответствующее BindingFlags значение для другую перегрузку вместо этого:

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

Обратите внимание, что вам необходимо указать здесь "instance" или "static"(или оба), а не просто «непубличный».Если вы также хотите искать общедоступные методы, вы должны также включить их.

Другая альтернатива - просто сделать ваш метод общедоступным:)

(Кроме того, я бы предложил переименовать егона HandleOrderCode чтобы быть более условным, идиоматическим C #.)

4 голосов
/ 18 апреля 2011

попробовать:

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