当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《c#-为动态创建的控件分配方法》经验,为你挑选了1个好方法。

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

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

我该怎么做呢?一个快速而肮脏的解决方案是将showPrefs()方法签名更改为showPrefs(对象发送者,EventArgs e).这样我可以将它分配给按钮,但我认为这是一个廉价的解决方法.

有任何想法吗?


click事件处理程序只接受具有方法签名(object o,EventArgs e)的委托,因此我不知道如何将showPrefs()方法分配给click事件.

多数民众赞成我遇到了麻烦.



1> 小智..:

我认为你需要澄清你所说的内容,因为你所要求的内容远比首先加载程序集复杂得多.

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

  ///An event handler, when fired, calls 
  void ShowPerfsEventHandler(object o, EventArgs e);

  //snip again
}

然后

Button b;
IEnumerable 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();
  }
}

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有