Visual Studio でフォームを作成すると、デザイナーは自動的にコンポーネント コンテナーを生成します。
/// <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 とそのコントロールには別のコレクションがあります。
すべてのサブクラスを変更せずにこれを達成する方法はありますか? リフレクションを使用して実行できると思いますが(あまり詳しくありません)、可能であればリフレクションを使用しないソリューションをお勧めします。