イベント ハンドラーを巧妙に「盗む」ことはできますか?
コーディングの難題で、あるコントロールから別のコントロールにイベント ハンドラーを転送しようとしています。 。それでも、コンパイラは頑固な障壁として立ちはだかります。
コードの難題:
Button btn1 = new Button(); btn1.Click += new EventHandler(btn1_Click); Button btn2 = new Button(); // Assign btn1's event to btn2 (but met with rejection from compiler) btn2.Click += btn1.Click; // Compiler denies
考えられる盗難手法:
リフレクションベースのトリック:
ブルートフォースがあなたのスタイルではない場合は、反射のマントを着ると秘密が明らかになるかもしれない
using System.Reflection; // Declare event key FieldInfo eventClick = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static); // Retrieve click event PropertyInfo eventsProp = typeof(Component).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance); EventHandlerList events1 = (EventHandlerList)eventsProp.GetValue(btn1, null); Delegate click = events1[eventClick.GetValue(null)]; // Remove from btn1, assign to btn2 events1.RemoveHandler(eventClick.GetValue(null), click); EventHandlerList events2 = (EventHandlerList)eventsProp.GetValue(btn2, null); events2.AddHandler(eventClick.GetValue(null), click);
注意してください。Microsoft はそのような策動を防ぐために強力な障壁を築いています。しかし、勇気のある人にとっては、このリフレクションを駆使するテクニックを使用すると、イベント処理の隠された領域へのアクセスが可能になります!
以上がC# のコントロール間でイベント ハンドラーを転送するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。