Добавить в цитаты Настройки чтения

Страница 255 из 502

<b>    Console.WriteLine(&quot;Анализ методов, определенных &quot; +</b>

<b>                &quot;в классе &quot; + t.Name);</b>

<b>    Console.WriteLine();</b>

<b>    Console.WriteLine(&quot;Поддерживаемые методы: &quot;);</b>

<b>    MethodInfo[] mi = t.GetMethods();</b>

<b>    // Вывести методы, поддерживаемые в классе MyClass.</b>

<b>    foreach (MethodInfo m in mi) {</b>

<b>      // Вывести возвращаемый тип и имя каждого метода.</b>

<b>      Console.Write(&quot; &quot; + m.ReturnType.Name + &quot; &quot; + m.Name + &quot;(&quot;);</b>

<b>      // Вывести параметры.</b>

<b>      ParameterInfo[] pi = m.GetParameters();</b>

<b>      for (int i = 0; i &lt; pi.Length; i++) {</b>

<b>        Console.Write(pi[i].ParameterType.Name + &quot; &quot; + pi[i].Name);</b>

<b>        if (i + 1 &lt; pi.Length) Console.Write(&quot;, &quot;);</b>

<b>      }</b>

<b>      Console.WriteLine(&quot;)&quot;);</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(&quot; &quot; + m.ReturnType.Name + &quot; &quot; + m.Name + &quot;(&quot;);</b>

<b>  // Вывести параметры.</b>

<b>  ParameterInfo[] pi = m.GetParameters();</b>

<b>  for(int i=0; i &lt; pi.Length; i++) {</b>

<b>    Console.Write(pi[i].ParameterType.Name + &quot; &quot; + pi[i].Name);</b>

<b>    if(i+1 &lt; pi.Length)</b>

<b>      Console.Write(&quot;, &quot;);</b>

<b>  }</b>

<b>}</b>

В этом фрагменте кода параметры, связанные с каждым методом, сначала создаются с помощью метода GetParameters() и сохраняются в массиве pi. Затем в цикле for происходит обращение к элементам массива pin выводится тип и имя каждого параметра. Самое главное, что все эти сведения создаются динамически во время выполнения программы, не опираясь на предварительную осведомленность о классе MyClass.

Существует вторая форма метода GetMethods(), позволяющая указывать различные флажки для отфильтровывания извлекаемых сведений о методах. Ниже приведена эта общая форма метода GetMethods().