Абсолютно вы можете смешивать делегатов с генериками. В 2.0, Predicate<T>
и т. Д. Являются хорошими примерами этого, но вы должны иметь одинаковое количество аргументов. В этом сценарии, возможно, вариант заключается в использовании перехватов для включения аргументов в делегат?
т.е.
public delegate void Action();
static void Main()
{
DoStuff(delegate {Foo(5);});
DoStuff(delegate {Bar("abc","def");});
}
static void DoStuff(Action action)
{
action();
}
static void Foo(int i)
{
Console.WriteLine(i);
}
static void Bar(string s, string t)
{
Console.WriteLine(s+t);
}
Обратите внимание, что Action
определено для вас в .NET 3.5, но вы можете повторно объявить его для целей 2.0; -p
Обратите внимание, что анонимный метод (delegate {...}
) также может быть параметризован:
static void Main()
{
DoStuff(delegate (string s) {Foo(5);});
DoStuff(delegate (string s) {Bar(s,"def");});
}
static void DoStuff(Action<string> action)
{
action("abc");
}
static void Foo(int i)
{
Console.WriteLine(i);
}
static void Bar(string s, string t)
{
Console.WriteLine(s+t);
}
Наконец, C # 3.0 делает все это намного проще и красивее с "лямбдами", но это уже другая тема; -p