Исследование объекта делегата
Исследование объекта делегата
Добавим в имеющийся пример вспомогательную функцию с именем DisplayDelegateInfo(). Она будет выводить имена методов, поддерживаемых поступающим типом, производным от System.Delegate, а также имя класса, определяющего метод. Для этого мы выполним цикл по элементам массива System.Delegate, возвращенного из GetInvocationList(), вызывая свойства Target и Method для каждого объекта.
static void DisplayDelegateInfo(Delegate delObj) {
// Вывод имен каждого из элементов
// списка вызовов делегата.
foreach (Delegate d in delQbj.GetInvocationList()) {
Console.WriteLine("Имя метода: {0}", d.Method);
Console.WriteLine("Имя типа: {0}", d.Target);
}
}
Если изменить метод Main() так, чтобы он вызывал этот новый вспомогательный метод, то вы увидите вывод, показанный на рис. 8.3.
![](https://storage.yandexcloud.net/wr4img/167642_292__8.3.png)
Рис. 8.3. Проверка списка вызовов делегата
Обратите внимание на то, что здесь имя типа (SimpleMath) свойством Target не отображается. Причина в том, что наш делегат BinaryOp указывает на статические методы, следовательно, нет объекта, на который нужно ссылаться! Но если изменить методы Add() и Subtract() так, чтобы они перестали быть статическими, можно создать экземпляр типа SimpleMath и указать методы для вызова так, как показано ниже.
static void Main(string[] args) {
Console.WriteLine("***** Пример делегата ***** ");
// Делегаты .NET могут указывать на методы экземпляра.
SimpleMath m = new SimpleMath();
BinaryOp b = new BinaryOp(m.Add);
// Вывод информации об объекте.
DisplayDelegateInfо(b);
Console.WriteLine(" 10 + 10 равно {0}", b(10, 10));
Console.ReadLine();
}
Теперь вы должны увидеть вывод, показанный на рис. 8.4.
![](https://storage.yandexcloud.net/wr4img/167642_292__8.4.png)
Рис. 8.4. Проверка списка вызовов делегата (новая попытка)
Исходный код. Проект SimpleDelegate размещен в подкаталоге, соответствующем главе 8.