ホームページ > バックエンド開発 > C++ > C# のコントロール間でイベント ハンドラーを転送するにはどうすればよいですか?

C# のコントロール間でイベント ハンドラーを転送するにはどうすればよいですか?

Linda Hamilton
リリース: 2025-01-02 14:51:38
オリジナル
678 人が閲覧しました

How Can I Transfer an Event Handler Between Controls in C#?

イベント ハンドラーを巧妙に「盗む」ことはできますか?

コーディングの難題で、あるコントロールから別のコントロールにイベント ハンドラーを転送しようとしています。 。それでも、コンパイラは頑固な障壁として立ちはだかります。

コードの難題:

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート