Delegados genéricos (Guía de programación de C#)

Un delegado puede definir sus propios parámetros de tipo.El código que hace referencia al delegado genérico puede especificar el tipo de argumento para crear un tipo construido abierto, igual que al crear una instancia de una clase genérica o al llamar a un método genérico, como se muestra en el siguiente ejemplo:

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

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

C# 2.0 tiene una nueva característica denominada conversión de grupo de métodos, que se aplica a los tipos delegados concretos y genéricos, y permite escribir la línea anterior con esta sintaxis simplificada:

Del<int> m2 = Notify;

Los delegados definidos dentro de una clase genérica pueden utilizar los parámetros de tipo de la clase genérica de la misma manera que lo hacen los métodos de clase.

class Stack<T>
{
    T[] items;
    int index;

    public delegate void StackDelegate(T[] items);
}

El código que hace referencia al delegado debe especificar el argumento de tipo de la clase contenedora, de la siguiente manera:

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

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

Los delegados genéricos son especialmente útiles para definir eventos basados en el patrón de diseño habitual porque el argumento del remitente puede estar fuertemente tipado y ya no tiene que convertirse a y de 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)
    {
        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;
}

Vea también

Referencia

Introducción a los genéricos (Guía de programación de C#)

Métodos genéricos (Guía de programación de C#)

Clases genéricas (Guía de programación de C#)

Interfaces genéricas (Guía de programación de C#)

Delegados (Guía de programación de C#)

System.Collections.Generic

Conceptos

Guía de programación de C#

Otros recursos

Genéricos en .NET Framework