7

同じ署名を持つ一連のイベントがあります。今、私はすべてのイベントに対してこれを行うためのジェネリックイベントハンドラー発生メソッドを作成できるかどうか疑問に思いますか?

  • これは、イベントを次のように送信することは可能<T>ですか?
4

3 に答える 3

11

これがすべて単一のクラス内にある場合は、それらのいずれかで機能するイベントを発生させるメソッドを作成できます。たとえば、すべてのイベントがEventHandler<T>の場合、次を使用できます。

private void RaiseEvent<T>(EventHandler<T> eventHandler, T eventArgs)
{
    if (eventHandler != null)
    {
        eventHandler(this, eventArgs);
    } 
}

次に、次の方法でこれを呼び出すことができます。

this.RaiseEvent(this.MyEvent, new MyEventArgs("Foo"));
于 2012-09-28T16:50:48.553 に答える
2

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>。戻り値の型が から に変更されvoidboolイベントのリスナーがあったかどうかを返します。めったに使用されないので、気軽に に戻してvoidください。

使用例:

public event EventHandler<FooArgs> FooHappend;

public void Foo()
{
    Event.Raise(this, FooHappend, new FooArgs("Hello World!");
}
于 2017-05-05T09:20:39.380 に答える
-1

これを参照してください。それはあなたが望むものを説明しています。

型指定されたデリゲートを使用し、それをイベントに使用することで、型指定されたイベントを作成できます。

public delegate void myDel<T>(T stuff);

public event myDel<int> myEvent;

public doStuff()
{
    myDel(1);
}
于 2012-09-28T16:44:48.557 に答える