Универсальные делегаты. (Руководство по программированию на C#)

Обновлен: Ноябрь 2007

Делегат может определять собственные параметры-типы. Код, ссылающийся на универсальный делегат, может указать аргумент типа для создания закрытого конструируемого типа так же, как и при создании универсального класса или вызове универсального метода, как показано в следующем примере.

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>
{
    T[] items;
    int index;

    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;
}

Универсальные делегаты особенно полезны при определении событий на основе типичного шаблона разработки, поскольку аргумент отправителя может быть строго типизированным и его больше нельзя привести к типу 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;
}

См. также

Основные понятия

Руководство по программированию в C#

Ссылки

Введение в универсальные шаблоны. (Руководство по программированию на C#)

Универсальные методы (Руководство по программированию на C#)

Универсальные классы (руководство по программированию на C#)

Универсальные интерфейсы. (Руководство по программированию на C#)

Делегаты (руководство по программированию на C#)

System.Collections.Generic

Другие ресурсы

Универсальные шаблоны в платформе .NET Framework