Általános meghatalmazottak (C# programozási útmutató)
A meghatalmazott saját típusparamétereket határozhat meg. Az általános meghatalmazottra hivatkozó kód megadhatja a típusargumentumot egy zárt, konstruált típus létrehozásához, ugyanúgy, mint egy általános osztály példányosításakor vagy egy általános metódus meghívásakor, ahogyan az alábbi példában látható:
public delegate void Del<T>(T item);
public static void Notify(int i) { }
Del<int> m1 = new Del<int>(Notify);
A C# 2.0-s verziója egy új, metóduscsoport-átalakítás nevű funkcióval rendelkezik, amely konkrét és általános delegálási típusokra is vonatkozik, és lehetővé teszi az előző sor írását ezzel az egyszerűsített szintaxissal:
Del<int> m2 = Notify;
Az általános osztályon belül definiált meghatalmazottak ugyanúgy használhatják az általános osztálytípus paramétereit, mint az osztály metódusai.
class Stack<T>
{
public delegate void StackDelegate(T[] items);
}
A meghatalmazottra hivatkozó kódnak meg kell adnia a tartalmazó osztály típusargumentumát az alábbiak szerint:
private static void DoWork(float[] items) { }
public static void TestStack()
{
Stack<float> s = new Stack<float>();
Stack<float>.StackDelegate d = DoWork;
}
Az általános meghatalmazottak különösen hasznosak az események tipikus tervezési mintán alapuló meghatározásában, mivel a feladó argumentuma erősen beírható, és már nem kell átvenni azokat a rendszerből 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;
}