質問:
イベント ハンドラーを「盗む」ことは考えられますか? 1 つのコントロールに関連付けて、それを割り当てる別の?
答え:
はい、可能です。ただし、反省は必要です。関連するメンバーの多くはプライベートまたは内部として隠蔽されます。
実装:
新しい Windows フォーム プロジェクトを作成し、そのフォームに 2 つのボタンを配置します。次に、次のコードを使用します:
using System; using System.ComponentModel; using System.Windows.Forms; using System.Reflection; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); button1.Click += new EventHandler(button1_Click); // Get secret click event key FieldInfo eventClick = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static); object secret = eventClick.GetValue(null); // Retrieve the click event PropertyInfo eventsProp = typeof(Component).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance); EventHandlerList events = (EventHandlerList)eventsProp.GetValue(button1, null); Delegate click = events[secret]; // Remove it from button1, add it to button2 events.RemoveHandler(secret, click); events = (EventHandlerList)eventsProp.GetValue(button2, null); events.AddHandler(secret, click); } void button1_Click(object sender, EventArgs e) { MessageBox.Show("Yada"); } } }
注: これは、Microsoft がセキュリティ上の理由から重要なメソッドへのアクセスをどのように制限しているかを示しています。
以上がリフレクションを使用してコントロール間でイベント ハンドラーを転送できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。