Запуск динамической пустоты из сборки, загруженной в интерфейс - PullRequest
1 голос
/ 29 августа 2010

Итак, у меня есть сборка, которую я загрузил в интерфейс, и она отлично работает:

MarshalByRefObject pluginObject = ...
ecko.Plugins.Interface.Plugin plug = pluginObject as ecko.Plugins.Interface.Plugin;

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

это то, что я пытался (используя в качестве примера методы «Выполнить»):

 plug.GetType().GetMethod("Execute").Invoke((what-the-hell-do-i-put-here), new object[] { });

я на правильном пути? пожалуйста, ведите меня:)

спасибо.

1 Ответ

1 голос
/ 29 августа 2010

Если вы хотите использовать Reflection, то недостающий фрагмент в вашем коде:

 MethodInfo meth = plug.GetType().GetMethod("Execute");
 meth.Invoke(plug, new object[] { }); 

Первый параметр метода Invoke должен быть экземпляром, для которого вы хотите вызвать метод.Это необходимо, потому что meth является просто абстрактным описанием метода (и не связано ни с одним экземпляром).Это полезно, если вы хотите вызывать метод в нескольких экземплярах (вы можете кэшировать значение meth).

Если вы используете C # 4.0, тогда вы можете использовать новую функцию dynamic (при условиичто «Выполнить» - это имя, которое не изменяется):

dynamic plugDynamic = plug;
plugDynamic.Execute( /* arguments */ );

Если переменная объявлена ​​как dynamic в C # 4.0, то вы можете вызывать любые методы, которые захотите, и разрешение метода будет выполнено.во время выполнения (аналогично Reflection, но немного сложнее и эффективнее).

...