内部的に対処する必要がある状況に遭遇しましたDelegate
が、一般的な制約が必要でした。具体的には、リフレクションを使用してイベント ハンドラーを追加したかったのですが、デリゲートにはジェネリック引数を使用したかったのです。Handler
「Handler」は型変数であり、コンパイラは にキャストしないため、以下のコードは機能しませんDelegate
。
public void AddHandler<Handler>(Control c, string eventName, Handler d) {
c.GetType().GetEvent(eventName).AddEventHandler(c, (Delegate) d);
}
ただし、変換を行う関数を渡すことができます。引数をconvert
取り、次を返します:Handler
Delegate
public void AddHandler<Handler>(Control c, string eventName,
Func<Delegate, Handler> convert, Handler d) {
c.GetType().GetEvent(eventName).AddEventHandler(c, convert(d));
}
これでコンパイラは満足です。メソッドの呼び出しは簡単です。たとえばKeyPress
、Windows フォーム コントロールのイベントにアタッチします。
AddHandler<KeyEventHandler>(someControl,
"KeyPress",
(h) => (KeyEventHandler) h,
SomeControl_KeyPress);
SomeControl_KeyPress
イベントターゲットはどこですか。重要なのはコンバーターのラムダです。これは機能しませんが、有効なデリゲートを指定したことをコンパイラーに納得させます。
(Begin 280Z28) @Justin: なぜこれを使わないのですか?
public void AddHandler<Handler>(Control c, string eventName, Handler d) {
c.GetType().GetEvent(eventName).AddEventHandler(c, d as Delegate);
}
(エンド280Z28)