Выполнение многоадресных делегатов - PullRequest
2 голосов
/ 14 октября 2010

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

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

Ответы [ 2 ]

4 голосов
/ 14 октября 2010

Ну, может быть 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);
}
1 голос
/ 14 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...