次の方法で共有


汎用デリゲート (C# プログラミング ガイド)

デリゲートは、独自の型パラメーターを定義できます。 ジェネリック デリゲートを参照するコードでは、次の例に示すように、ジェネリック クラスのインスタンス化やジェネリック メソッドの呼び出しと同様に、閉じた構築型を作成する型引数を指定できます。

public delegate void Del<T>(T item);
public static void Notify(int i) { }

Del<int> m1 = new Del<int>(Notify);

C# バージョン 2.0 には、メソッド グループ変換と呼ばれる新しい機能があります。これは具象型と汎用デリゲート型に適用され、次の簡略化された構文で前の行を記述できます。

Del<int> m2 = Notify;

ジェネリック クラス内で定義されたデリゲートは、クラス メソッドと同じ方法でジェネリック クラス型パラメーターを使用できます。

class Stack<T>
{
    public delegate void StackDelegate(T[] items);
}

デリゲートを参照するコードでは、次のように、包含クラスの型引数を指定する必要があります。

private static void DoWork(float[] items) { }

public static void TestStack()
{
    Stack<float> s = new Stack<float>();
    Stack<float>.StackDelegate d = DoWork;
}

一般的なデリゲートは、sender 引数を厳密に型指定でき、 Objectとの間でキャストする必要がなくなったため、一般的なデザイン パターンに基づいてイベントを定義する場合に特に便利です。

delegate void StackEventHandler<T, U>(T sender, U eventArgs);

class Stack<T>
{
    public class StackEventArgs : System.EventArgs { }
    public event StackEventHandler<Stack<T>, StackEventArgs>? StackEvent;

    protected virtual void OnStackChanged(StackEventArgs a)
    {
        if (StackEvent is not null)
            StackEvent(this, a);
    }
}

class SampleClass
{
    public void HandleStackChange<T>(Stack<T> stack, Stack<T>.StackEventArgs args) { }
}

public static void Test()
{
    Stack<double> s = new Stack<double>();
    SampleClass o = new SampleClass();
    s.StackEvent += o.HandleStackChange;
}

こちらも参照ください