Obecní delegáti (Průvodce programováním v C#)

Delegát může definovat vlastní parametry typu. Kód, který odkazuje na obecného delegáta, může zadat argument typu pro vytvoření uzavřeného vytvořeného typu, stejně jako při vytváření instance obecné třídy nebo volání obecné metody, jak je znázorněno v následujícím příkladu:

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

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

C# verze 2.0 má novou funkci označovanou jako převod skupiny metod, která se vztahuje na konkrétní i obecné typy delegátů a umožňuje napsat předchozí řádek s touto zjednodušenou syntaxí:

Del<int> m2 = Notify;

Delegáti definovaní v rámci obecné třídy mohou použít parametry obecného typu třídy stejným způsobem jako metody třídy.

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

Kód, který odkazuje na delegáta, musí určit typ argumentu obsahující třídy následujícím způsobem:

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

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

Obecné delegáty jsou zvláště užitečné při definování událostí na základě typického vzoru návrhu, protože argument odesílatele může být silného typu a již nemusí být přetypován do a z 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;
}

Viz také