同じ署名を持つ一連のイベントがあります。今、私はすべてのイベントに対してこれを行うためのジェネリックイベントハンドラー発生メソッドを作成できるかどうか疑問に思いますか?
- これは、イベントを次のように送信することは可能
<T>
ですか?
同じ署名を持つ一連のイベントがあります。今、私はすべてのイベントに対してこれを行うためのジェネリックイベントハンドラー発生メソッドを作成できるかどうか疑問に思いますか?
<T>
ですか?これがすべて単一のクラス内にある場合は、それらのいずれかで機能するイベントを発生させるメソッドを作成できます。たとえば、すべてのイベントがEventHandler<T>
の場合、次を使用できます。
private void RaiseEvent<T>(EventHandler<T> eventHandler, T eventArgs)
{
if (eventHandler != null)
{
eventHandler(this, eventArgs);
}
}
次に、次の方法でこれを呼び出すことができます。
this.RaiseEvent(this.MyEvent, new MyEventArgs("Foo"));
Reed Copsey の返信の静的バージョンについては、静的クラスを作成しましたEvent
。
public static class Event
{
public static bool Raise<T>(Object source, EventHandler<T> eventHandler, T eventArgs) where T : EventArgs
{
EventHandler<T> handler = eventHandler;
if (handler != null)
{
handler(source, eventArgs);
return true;
}
return false;
}
}
これは、イベント ハンドラーのタイプが であることも前提としていますEventHandler<T>
。戻り値の型が から に変更されvoid
、bool
イベントのリスナーがあったかどうかを返します。めったに使用されないので、気軽に に戻してvoid
ください。
使用例:
public event EventHandler<FooArgs> FooHappend;
public void Foo()
{
Event.Raise(this, FooHappend, new FooArgs("Hello World!");
}
これを参照してください。それはあなたが望むものを説明しています。
型指定されたデリゲートを使用し、それをイベントに使用することで、型指定されたイベントを作成できます。
public delegate void myDel<T>(T stuff);
public event myDel<int> myEvent;
public doStuff()
{
myDel(1);
}