Как запустить любой метод, зная только ее полное имя - PullRequest
0 голосов
/ 02 декабря 2008

У меня есть название метода: "Garden.Plugins.Code.Beta.Business.CalculateRest"

Как запустить? Я думаю об этом причудливом решении на основе отражения, таком как RunMethod (строка MethodName)

Ответы [ 4 ]

3 голосов
/ 02 декабря 2008
  • Разделите его на имя типа и имя метода, разделив последнюю точку
  • Получите тип, используя Type.GetType или Assembly.GetType . (Type.GetType будет искать только текущую сборку и mscorlib, если вы не укажете имя сборки в аргументе.)
  • Получите метод из типа, используя Type.GetMethod . Предполагая, что это публичный статический метод, укажите BindingFlags.Public | BindingFlags.Static.
  • Выполните метод, вызвав MethodInfo.Invoke (null, null). (Первый ноль указывает «нет цели» - то есть это статический метод; второй - без аргументов.)

Если вы хотите вызвать метод экземпляра или метод, который принимает параметры, вам нужно будет решить, как получить эту информацию.

2 голосов
/ 02 декабря 2008

Это не так просто, как обрабатывать все слева от последней точки, как буквальное имя типа. Если у вас есть тип формы:

X.Y.Z.Type

тогда не обязательно, что X, Y и Z являются пространствами имен. Они также могут быть самими типами, а последующие части могут быть внутренними классами:

class X
{
  class Y
  {
   // etc
  }
}

Если это так, то Type.GetType ("X.YU") не будет преобразован в класс Y. Вместо этого clr разделяет внутренние классы символом +, поэтому вам действительно нужно вызвать Type.GetType ( "X + Y");

Если метод, который вы вызываете, это метод params , вам потребуется дополнительная работа. Вы должны свернуть параметры переменной в массив и передать это. Вы можете проверить переменные параметры, захватив данные ParameterInfo для метода и посмотрев, имеет ли последний параметр прикрепленный атрибут ParamArray .

1 голос
/ 02 декабря 2008

Если тип является типом экземпляра:

Type.GetType("Garden.Plugins.Code.Beta.Business")
    .GetMethod("CalculateRest").Invoke(myInstanceOfTheType, param1, param2);

Если это статический метод:

Type.GetType("Garden.Plugins.Code.Beta.Business")
    .GetMethod("CalculateRest").Invoke(null, param1, param2);

Если он не принимает параметры, просто пропустите "param1, param2 и т. Д." ...

1 голос
/ 02 декабря 2008

Это будет медленно, поверь мне. Так что не ставьте это в критическое место.

Кроме этого вам просто нужно будет сделать это "вручную". Начните перечислять все пространства имен, классы и т. Д., Пока не найдете то, что вам нужно. Я не думаю, что есть что-то необычное, готовое для этого. (Хотя я не искал)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...