ソフトウェア開発では、1 つのコントロールからイベント ハンドラーを割り当てることが必要な場合があります。実行時に別のものに。この記事では、このような操作の実現可能性を掘り下げ、潜在的な警告と利用可能な回避策の両方を調査します。
元の質問では、割り当てられたイベント ハンドラーを転送する方法を見つけようとしました。実行時にボタン (btn1) から別のボタン (btn2) へ。ただし、コンパイラはこの割り当てが無効であると判断し、イベント ハンドラは割り当ての左側にのみ割り当てられると述べました。
この単純なアプローチではコンパイラ エラーが発生しました。実行時にイベント ハンドラーを盗むことは確かに可能ですが、リフレクションが必要であるという注意点があります。リフレクションにより、通常はアクセスできないオブジェクトのプライベートおよび内部メンバーへのアクセスが許可されます。
解決策にはいくつかの手順が含まれます:
次のコードは、イベント窃取手法を示します:
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 がこれらの構造への直接アクセスを防ぐために多大な努力を払ってきたことは明らかであり、この手法は慎重に使用されるべきであることが示唆されています。
以上がC# ではイベント ハンドラーが盗まれて実行時に再割り当てされる可能性がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。