c# - 将方法分配给动态创建的控件

标签 c# events plugins delegates add-in

我正在设计一个支持插件开发的应用程序。它更像是一种学习练习。

加载到我的应用程序中的所有程序集(插件)都包含一个 showPrefs() 方法。当我加载每个程序集时,我想为每个程序集分配一个按钮,这样当我单击按钮时,它会触发按钮分配给的程序集的 showPrefs() 方法。

我该怎么做?一个快速而肮脏的解决方案是将 showPrefs() 方法签名更改为 showPrefs(object sender, EventArgs e)。这样我就可以将它分配给按钮,但我认为这是一种廉价的解决方法。

有什么想法吗?


点击事件处理程序只接受方法签名为 (object o, EventArgs e) 的委托(delegate),所以我不知道如何将 showPrefs() 方法分配给点击事件。

这就是我遇到的问题。

最佳答案

我认为你需要澄清你在说什么,因为你所问的比首先加载程序集要简单得多。

完成程序集加载后,您将获得一个实现接口(interface)的类型列表。只需遍历,为每个按钮创建按钮,然后在按钮的点击事件处理程序中运行您的 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();
  }
}

关于c# - 将方法分配给动态创建的控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/435138/

相关文章:

c# - 我如何消除具有某些祖先的元素?

javascript - Raphael.js 点击事件

objective-c - 从 Cocoa 应用程序中的插件加载时如何使控件为 "tabable"?

android - 在 cordova cli 插件构建中在哪里设置类路径

c# - 在 IE 扩展中显示本 map 标

c# - .NET Core 128kb 部署到 Azure 应用服务的文件大小限制

c# - 一个事件是否需要至少有一个处理程序?

c# - 事件作为方法返回值,是否正确?

android - 单击 webview 区域时启动事件

c# - 将整个 byte[] 转换为 uint