Отражение, призывать - PullRequest
0 голосов
/ 23 мая 2010

У меня есть файл DLL, и я взял из него объект и вызвал функции внутри этой библиотеки DLL следующим образом:

Command testClass = (Command)assembly.CreateInstance(creatObject);                
testClass.Execute();

Я почему-то использовал отражение. Поэтому мне нужно использовать функцию invoke и установить значения для переменных, затем вызвать основную функцию Execute.

Ранее я писал следующее:

object returnValue = objectType.GetMethod("setValues").Invoke(classObject, arguments);
testClass.Execute();

но это было бесполезно для меня.

Я использовал следующее:

object returnValue = objectType.GetMethod("setValues").Invoke(classObject, arguments);
object returnValue1 = objectType.GetMethod("Execute").Invoke(classObject, null);

Я просто хочу спросить, правильно ли это, вызывать execute таким образом, и, кстати, он работает!

Ответы [ 3 ]

3 голосов
/ 23 мая 2010

Вызывать методы с использованием Reflection так, как вы его используете, «нормально», если вы знаете, что делаете. При использовании Reflection необходимо учитывать несколько моментов:

  • Это небезопасно - вы легко можете ошибиться - если вы измените имя метода, компилятор не уведомит вас об этом, и вы обнаружите, что во время выполнения
  • Это медленно - Отражение просто неэффективно - вызов метода медленнее на несколько порядков.

Если вам нужно делать это очень редко, тогда это может быть хорошо. Тем не менее, ваш первоначальный подход с использованием общего базового класса Command представляется мне гораздо лучшей идеей. Не могли бы вы уточнить, почему вы решили использовать Reflection, чтобы мы могли (возможно) предложить лучший способ?

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

1 голос
/ 23 мая 2010

Это неправильно, почему вы используете Reflection, предоставляете общий интерфейс и вызываете метод напрямую.Если вы не знаете, почему вы используете отражение, то это неправильно:)

Если вы внедряете расширяемую систему, возможно, MEF будет лучше?

0 голосов
/ 24 мая 2010

Спасибо за ваши ответы, конечно, я знаю, почему я использовал Reflection.Потому что мне нужно установить значения для функции setValues(i, j..etc) во время выполнения, и эти параметры и их имена отличаются от DLL к другому.затем я должен вызвать эту функцию с ее текущими значениями и, наконец, запустить другую функцию с именем Execute() с теми же текущими значениями, которые можно изменить для программы на выполнение!поэтому, когда я только что использовал:

object returnValue = objectType.GetMethod("setValues").Invoke(classObject, arguments);
testClass.Execute();

, выполнение не работало со значениями времени выполнения, которые были введены.Но по этому:

object returnValue = objectType.GetMethod("setValues").Invoke(classObject, arguments);
object returnValue1 = objectType.GetMethod("Execute").Invoke(classObject, null);

это работает.Так что я просто хочу быть уверен, что моя работа правильная и подходит не только для моего случая!

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