Страница 255 из 502
<b> Console.WriteLine("Анализ методов, определенных " +</b>
<b> "в классе " + t.Name);</b>
<b> Console.WriteLine();</b>
<b> Console.WriteLine("Поддерживаемые методы: ");</b>
<b> MethodInfo[] mi = t.GetMethods();</b>
<b> // Вывести методы, поддерживаемые в классе MyClass.</b>
<b> foreach (MethodInfo m in mi) {</b>
<b> // Вывести возвращаемый тип и имя каждого метода.</b>
<b> Console.Write(" " + m.ReturnType.Name + " " + m.Name + "(");</b>
<b> // Вывести параметры.</b>
<b> ParameterInfo[] pi = m.GetParameters();</b>
<b> for (int i = 0; i < pi.Length; i++) {</b>
<b> Console.Write(pi[i].ParameterType.Name + " " + pi[i].Name);</b>
<b> if (i + 1 < pi.Length) Console.Write(", ");</b>
<b> }</b>
<b> Console.WriteLine(")");</b>
<b> Console.WriteLine();</b>
<b> }</b>
<b> }</b>
<b>}</b>
Эта программа дает следующий результат.
<b>Поддерживаемые методы:</b>
<b>Int32 Sum()</b>
<b>Boolean IsBetween (Int32 i)</b>
<b>Void Set(Int32 a, Int32 b)</b>
<b>Void Set (Double a, Double b)'</b>
<b>Void Show()</b>
<b>String ToString()</b>
<b>Boolean Equals(Object ob j )</b>
<b>Int32 GetHashCode()</b>
<b>Type GetType()</b>
Как видите, помимо методов, определенных в классе MyClass, в данной программе выводятся также методы, определенные в классе object, поскольку все типы данных в C# наследуют от класса object. Кроме того, в качестве имен типов указываются имена структуры .NET. Обратите также внимание на то, что метод Set() выводится дважды, поскольку он перегружается. Один из его вариантов принимает аргументы типа int, а другой — аргументы типа double.
Рассмотрим эту программу более подробно. Прежде всего следует заметить, что в классе MyClass определен открытый конструктор и ряд открытых методов, в том числе и перегружаемый метод Set().
Объект класса Туре, представляющий класс MyClass, создается в методе Main() в следующей строке кода.
<b>Type t = typeof(MyClass); // получить объект класса Туре,</b>
<b>// представляющий класс MyClass</b>
Напомним, что оператор typeof возвращает объект класса Туре, представляющий конкретный тип данных (в данном случае — класс MyClass).
С помощью переменной t и прикладного интерфейса Reflection API в данной программе затем выводятся сведения о методах, поддерживаемых в классе MyClass. Для этого в приведенной ниже строке кода сначала выводится список соответствующих методов.
<b>MethodInfo[] mi = t.GetMethods();</b>
Затем в цикле foreach организуется обращение к элементам массива mi. На каждом шаге этого цикла выводится возвращаемый тип, имя и параметры отдельного метода, как показано в приведенном ниже фрагменте кода.
<b>foreach(MethodInfo m in mi) {</b>
<b> // Вывести возвращаемый тип и имя каждого метода.</b>
<b> Console.Write(" " + m.ReturnType.Name + " " + m.Name + "(");</b>
<b> // Вывести параметры.</b>
<b> ParameterInfo[] pi = m.GetParameters();</b>
<b> for(int i=0; i < pi.Length; i++) {</b>
<b> Console.Write(pi[i].ParameterType.Name + " " + pi[i].Name);</b>
<b> if(i+1 < pi.Length)</b>
<b> Console.Write(", ");</b>
<b> }</b>
<b>}</b>
В этом фрагменте кода параметры, связанные с каждым методом, сначала создаются с помощью метода GetParameters() и сохраняются в массиве pi. Затем в цикле for происходит обращение к элементам массива pin выводится тип и имя каждого параметра. Самое главное, что все эти сведения создаются динамически во время выполнения программы, не опираясь на предварительную осведомленность о классе MyClass.
Существует вторая форма метода GetMethods(), позволяющая указывать различные флажки для отфильтровывания извлекаемых сведений о методах. Ниже приведена эта общая форма метода GetMethods().