泛型委派 (C# 程式設計手冊)

delegate 能夠定義自己的型別參數。 如下列程式碼範例所示,參考泛型委派 (Delegate) 的程式碼可以指定型別引數以建立封閉式建構型別,就像在產生泛型類別或呼叫泛型方法時一樣:

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# 程式設計手冊)

System.Collections.Generic

概念

C# 程式設計手冊

其他資源

.NET Framework 中的泛型