Неплохо предварительно ознакомиться с примерами обобщений Обобщенная коллекция Dictionary, Обобщенный метод на c# и Делегаты и методы на c#.
Предположим, что при создание c# делегата, мы захотим сделать его боле универсальным, а точнее обобщенным!
Нет ничего проще:
public delegate void SomeDelegate<T>(T item);
T - это общий (любой, конкретный в момент вызова) тип параметра, который будет принимать метод.
С определением сигнатуры делегата закончили. Следующим шагом это создать метод(ы), для того чтоб продемонстрировать саму роботу делегата. Вот метод:
public static void Show(string msg)
{
Console.WriteLine(msg);
Console.ReadLine();
}
Сигнатура делегата определена, методы созданы, осталось указать метод делегату, с которым ему работать. Для этого создадим объект нашего делегата:
SomeDelegate<int> d1 = new SomeDelegate<int>(Show);
d1(5);
А вот, собственно, и весь код:
using System;
public delegate void SomeDelegate<T>(T item);
class Program
{
static void Main(string[] args)
{
SomeDelegate<int> d1 =
new SomeDelegate<int>(Show);
d1(5);
}
public static void Show(int a)
{
Console.WriteLine(a + " " + a);
Console.ReadLine();
}
}
Естественно, можно назначать методы с несколькими входными параметрами:
using System;
public delegate void SomeDelegate
<T1, T2, T3>(T1 i, T2 s, T3 b);
class Program
{
static void Main(string[] args)
{
SomeDelegate<int, string, bool> d1 =
new SomeDelegate<int, string, bool>(Show);
d1(5, "ТЕСТ", true);
}
public static void Show(int i, string s, bool b)
{
if (b)
for (int count = 0; count < i; count ++ )
Console.WriteLine(s + Environment.NewLine);
Console.ReadKey();
}
}
Сложностей нет вовсе, но вы должны понимать, что обобщенные делегаты, как и другие виды обобщений вы должны использовать действительно тогда, когда это необходимо поскольку обобщение (читай всеприменяемость) дается жертвой в скорости исполнения.