У меня есть множественная цель
Func<int,int,int> funHandler=Max;
funHandler+=square;
Когда я выполняю
Console.WriteLine(funHandler(10,10));
возвращает square
из 10 (т.е. 200). Не срабатывал Max
.
Я использовал что-то вроде
foreach(var v in funHandler.GetInvocationList())
{
Console.WriteLine(v(10,20));
}
'V' - переменная, но она используется как метод. Как я могу запустить все методы, находящиеся в список вызовов?
Ну, может быть, Max
не имеет побочных эффектов, и вы не можете его заметить? Когда вы выполняете делегат многоадресной рассылки, он возвращает результат только последнего делегата.
Попробуйте следующее:
Func<int, int, int> funHandler = (x, y) => { Console.WriteLine(x); return x; };
funHandler += (x, y) => { Console.WriteLine(y); return y; };
int res = funHandler(1, 2);
Console.WriteLine(res);
См? он работает
Чтобы использовать список вызовов, выполните следующие действия:
foreach (var v in funHandler.GetInvocationList())
{
((Func<int, int, int>)v)(1, 2);
}
Или:
foreach (Func<int, int, int> v in funHandler.GetInvocationList())
{
v(1, 2);
}
foreach (Func<int, int, int> v in funHandler.GetInvocationList()) { v(1,2); }
работать так же? Выглядит чище ИМХО.
Многоадресная рассылка с делегатом, который возвращает что-то, не имеет для меня большого смысла. Я предполагаю, что он выполняет все из них, но отбрасывает все результаты, кроме одного.