【问题标题】:Running a dynamic void from a assembly loaded into an interface从加载到接口中的程序集运行动态 void
【发布时间】:2011-04-05 07:33:40
【问题描述】:

所以,我有一个加载到界面中的程序集,它运行良好:

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[] { });

我在正确的轨道上吗?请指导我:)

谢谢。

【问题讨论】:

  • 我认为你的术语有点混乱——当谈到“空洞”时,你的意思是“方法”吗?
  • @Tomas:你是对的。更新帖子

标签: c# plugins interface assemblies


【解决方案1】:

如果您想使用反射,那么您的代码中缺少的部分是:

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

Invoke 方法的第一个参数应该是您要调用该方法的实例。这是必需的,因为meth 只是方法的抽象描述(并且不与任何实例相关联)。如果您想在多个实例上调用该方法,这很有用(您可以缓存 meth 值)。

如果您使用的是 C# 4.0,那么您可以使用新的 dynamic 功能(假设“Execute”是一个不变的名称):

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

如果一个变量在 C# 4.0 中被声明为dynamic,那么你可以调用任何你想要的方法,并且方法解析将在运行时完成(类似于反射,但更复杂一点,效率更高一点)。

【讨论】:

  • 我实际上得到“对象引用未设置为对象的实例。”这里:prntscr.com/syxs
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
相关资源
最近更新 更多