Genel Temsilciler (C# Programlama Kılavuzu)

Temsilci kendi tür parametrelerini tanımlayabilir. Genel temsilciye başvuran kod, aşağıdaki örnekte gösterildiği gibi genel bir sınıfın örneğini oluştururken veya genel bir yöntemi çağırırken olduğu gibi kapalı oluşturulmuş bir tür oluşturmak için tür bağımsız değişkenini belirtebilir:

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

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

C# sürüm 2.0,yöntem grubu dönüştürme adlı yeni bir özelliğe sahiptir ve bu özellik hem somut hem de genel temsilci türleri için geçerlidir ve bu basitleştirilmiş söz dizimi ile önceki satırı yazmanızı sağlar:

Del<int> m2 = Notify;

Genel bir sınıf içinde tanımlanan temsilciler, genel sınıf türü parametrelerini sınıf yöntemleriyle aynı şekilde kullanabilir.

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

Temsilciye başvuran kod, aşağıdaki gibi içeren sınıfın tür bağımsız değişkenini belirtmelidir:

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

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

Genel temsilciler, tipik tasarım desenine göre olayları tanımlamada özellikle yararlıdır çünkü gönderen bağımsız değişkeni kesin olarak yazılabilir ve artık öğesine ve öğesinden Objecttüremesi gerekmez.

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

Ayrıca bkz.