我认为你需要澄清你在说什么,因为你所问的比首先加载程序集要简单得多。
完成程序集加载后,您将获得一个实现接口的类型列表。只需迭代,为每个按钮创建按钮,然后在按钮的单击事件处理程序中运行您的 showPrefs 方法。
这是一些 c# 伪代码:
Button b;
foreach(var i in instancesThatHavePrefsMethods)
{
b = new Button();
b.Click += (o,e) => { i.showPrefs(); };
this.Children.Add(b);
}
一旦我有了这些类型,我就可以实例化其中的一个,并保留它们。然后我需要做的就是为每个按钮创建一个按钮,添加一个事件处理程序(由伪代码中的 lambda 创建的外壳保存对正确实例的引用;您也可以创建自己的类来执行此操作或授权一个事件处理程序在您的界面中),然后将按钮添加到您的表单中。
根据您的说明,有几种不同的方法可以做到这一点。
首先,因此在您的界面上授权一个事件处理程序:
public interface IPluginKLol
{
//snip
///<summary>An event handler, when fired, calls <seealso cref="showPerfs"/></summary>
void ShowPerfsEventHandler(object o, EventArgs e);
//snip again
}
进而
Button b;
IEnumerable<IPluginKLol> instancesThatHavePrefsMethods = GetPlugins();
foreach(var i in instancesThatHavePrefsMethods)
{
b = new Button();
b.Click += i.ShowPerfsEventHandler;
this.Children.Add(b);
}
或者,您可以创建一个类来将事件转换为调用 showPerfs(只需实例化、设置引用并分配事件处理程序):
public class ShowPerfsBroker
{
public IPluginKLol Victim {get;set;}
public void ShowPerfsEventHandler(object o, EventArgs e)
{
if(Victim == null) return;
Victim.ShowPerfs();
}
}