Выполнение многоадресных делегатов

2

У меня есть множественная цель

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' - переменная, но она используется как метод. Как я могу запустить все методы, находящиеся в список вызовов?

  • 0
    Это работает Макс. Его возвращаемое значение попадает в область битов.
Теги:
delegates

2 ответа

4
Лучший ответ

Ну, может быть, 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);
}
  • 0
    Не будет foreach (Func<int, int, int> v in funHandler.GetInvocationList()) { v(1,2); } работать так же? Выглядит чище ИМХО.
  • 0
    Я думаю, что это будет работать. Но я не люблю прятать явное приведение в foreach.
1

Многоадресная рассылка с делегатом, который возвращает что-то, не имеет для меня большого смысла. Я предполагаю, что он выполняет все из них, но отбрасывает все результаты, кроме одного.

  • 0
    +1. На самом деле это не так.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню