在 Visual Studio 中制作表单时,Designer 会自动生成一个组件容器:
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
我们有几十个表单,它们都共享一个公共基类,以便于放入一些公共功能(“您有未保存的数据,您确定要关闭此窗口吗?”等等)。每个表单都有自己的BarManager组件(它们有不同的菜单和按钮等,所以没有人认为需要让它们继承该组件)。现在我们已经意识到我们想为所有这些 BarManagers 添加一个事件处理程序。
我希望能够做这样的事情:
public partial class Foo : Form
{
...
private void Foo_Shown(object sender, EventArgs e)
{
this.components.Components.OfType<BarManager>().ToList().ForEach(tb =>
{
tb.SomeEvent += new EventHandler(FooHandler);
});
}
protected void FooHandler(object sender, EventArgs e)
{
// do stuff
}
...
}
如果它在Controls
集合中,则该方法可以正常工作,但是由于components
是私有的,因此 Foo 及其控件具有单独的集合。
有没有办法在不修改每个子类的情况下实现这一点?我怀疑它可以通过反射来完成(我不太熟悉),但如果可能的话,我更喜欢没有反射的解决方案。