Как сохраняются методы в делегатах и как вызывать разные методы?
Разбираюсь с делегатами, возник вопрос который не совсем понимаю. Когда мы создали объект делегата то можем добавлять, или удалять из него методы которые подходят по сигнатуре.
delegate int IntSomeDelegate(int x, int y);
IntSomeDelegate somDelegate = (x, y) => (GetMultiply(x, y));
somDelegate += GetMultiply;
somDelegate += GetSum;
somDelegate -= GetMultiply;
Если мы добавляем или удаляем из делегата методы, то они должны хранится в какой то структуре данных, из которой потом можно дергать нужный нам метод через делегат. Как обращаться к нужному методу через делегат ? Или я совсем все неправильно понял ?
Ответы (1 шт):
Когда вы объявляете переменную делегатного типа, на самом деле вы получаете объект, производный от MulticastDelegate. Исходники этого класса можно посмотреть тут.
Вам обычно не должно быть нужно «разобрать» MulticastDelegate на составляющие его одиночные делегаты, вы вызываете всю группу делегатов вместе:
Action d = () => Console.WriteLine("delegate 1");
d += () => Console.WriteLine("delegate 2");
d();
Выводит следующее:
delegate 1
delegate 2
Но если очень хочется, можно получить список по частям, используя GetInvocationList():
foreach (Action part in d.GetInvocationList())
part();
Результат будет такой же, даже порядок делегатов гарантированно тот же.
Проверка: https://dotnetfiddle.net/Xadzcr