Исследование объекта делегата

Исследование объекта делегата

Добавим в имеющийся пример вспомогательную функцию с именем 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.

Рис. 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.

Рис. 8.4. Проверка списка вызовов делегата (новая попытка)

Исходный код. Проект SimpleDelegate размещен в подкаталоге, соответствующем главе 8.