Как вы называете метод по его «имени»? - PullRequest
9 голосов
/ 11 мая 2011

Каков будет способ вызова некоторого метода по имени, например, «Method1», если у меня есть Object и это Type?

Я хочу сделать что-то вроде этого:

Object o;
Type t;

// At this point I know, that 'o' actually has
// 't' as it's type.

// And I know that 't' definitely has a public method 'Method1'.

// So, I want to do something like:

Reflection.CallMethodByName(o, "Method1");

Это как-то возможно? Я понимаю, что это будет медленно, неудобно, но, к сожалению, у меня нет других способов реализовать это в моем случае.

Ответы [ 3 ]

12 голосов
/ 11 мая 2011

Вы бы использовали:

// Use BindingFlags for non-public methods etc
MethodInfo method = t.GetMethod("Method1");

// null means "no arguments". You can pass an object[] with arguments.
method.Invoke(o, null);

См. MethodBase.Invoke документы для получения дополнительной информации - например, для передачи аргументов.

Подход Стивена с использованием dynamic, вероятно, будетбыстрее (и определенно легче для чтения), если вы используете C # 4 и знаете имя метода во время компиляции.

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

11 голосов
/ 11 мая 2011

Если конкретное имя метода известно только во время выполнения, вы не можете использовать динамический и нужно использовать что-то вроде этого:

t.GetMethod("Method1").Invoke(o, null);

Это предполагает, что Method1 не имеет параметров.Если это так, вам нужно использовать одну из перегрузок GetMethod и передать параметры в качестве второго параметра в Invoke.

8 голосов
/ 11 мая 2011

Самый простой способ:

dynamic myObject = o;
myObject.Method1();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...