C # Эквивалент PHP динамического вызова метода - PullRequest
2 голосов
/ 10 октября 2010

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

$object->{$method}();

Где $object - это наш объект PHP, а $method - это имя метода, который мы хотим вызвать. Таким способом я могу динамически вызывать любой метод.

Есть ли C # эквивалент этого? Или я просто "делаю это неправильно"? У меня есть плагин / модуль, загруженный через Reflection, и я хотел бы вызвать метод, который не определен в интерфейсе.

Спасибо!

Ответы [ 3 ]

6 голосов
/ 10 октября 2010

В отличие от PHP, C # является статически типизированным языком, означающим, что типы должны быть известны во время компиляции.Хотя такой метод был введен в C # 4.0.Это ключевое слово dynamic .Это позволяет вам объявить переменную динамического типа и вызвать любой метод, который вам нравится, и компилятор не будет протестовать.Разрешение будет сделано во время выполнения:

dynamic obj = FetchInstanceFromSomewhere();
obj.Method();

Еще один более классический метод - использовать отражение, но это может быстро превратиться в кошмар.

3 голосов
/ 10 октября 2010

Как здесь ответили , C # 4 имеет ключевое слово dynamic, которое вызывает динамический метод.

Если вы используете более старую версию, вы можете сделать это с помощью Reflection, но я думаю, что это неправильный способ сделать это. C # способ сделать это - убедиться, что загруженный плагин имеет интерфейс, который содержит методы, которые вам нужно вызывать.

В любом случае, если вам нужно сделать это с помощью отражения, вот пример:

Type type = instance.GetType();
MethodInfo m = type.GetMethod("MethodName");
m.Invoke(instance, new object[] {});

Это для публичного метода, не принимающего аргументов.

2 голосов
/ 10 октября 2010

У меня есть плагин / модуль, загруженный через Reflection, и я хотел бы вызвать для него метод, который не определен в интерфейсе

Будьте осторожны, хотя ...приведенное предложение позвольте мне догадаться, что вы делаете что-то не так.Использование рефлексии «на помощь» является распространенным заблуждением многих пользователей c #.Если интерфейс в модуле был разработан без метода, который вы хотите вызвать, то, вероятно, была веская причина для этого решения.Если модуль был спроектирован правильно, вы все равно не сможете вызывать этот метод - это либо private, либо internal.

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