Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Un delegado puede definir sus propios parámetros de tipo. El código que hace referencia al delegado genérico puede especificar el argumento type para crear un tipo construido cerrado, al igual que al crear instancias de una clase genérica o llamar a un método genérico, como se muestra en el ejemplo siguiente:
public delegate void Del<T>(T item);
public static void Notify(int i) { }
Del<int> m1 = new Del<int>(Notify);
La versión 2.0 de C# tiene una nueva característica denominada conversión de grupo de métodos, que se aplica a tipos de delegados concretos y genéricos, y le permite escribir la línea anterior con esta sintaxis simplificada:
Del<int> m2 = Notify;
Los delegados definidos dentro de una clase genérica pueden usar los parámetros de tipo de clase genérico de la misma manera que lo hacen los métodos de clase.
class Stack<T>
{
public delegate void StackDelegate(T[] items);
}
El código que hace referencia al delegado debe especificar el argumento type de la clase contenedora, como se indica a continuación:
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)
{
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;
}