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

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

Assembly Assembly - Получает сборку для заданного типа

TypeAttributes Attributes -  Получает атрибуты для заданного типа

Type BaseType - Получает непосредственный базовый тип для заданного типа

string FullName - Получает полное имя заданного типа

bool IsAbstract - Истинно, если заданный тип является абстрактным

bool isArray - Истинно, если заданный тип является массивом

bool IsClass - Истинно, если заданный тип является классом

bool IsEnum - Истинно, если заданный тип является перечислением

bool IsGenericParameter - Истинно, если заданный тип является параметром обобщенного типа. (Более подробно обобщения рассматриваются в главе 18.)

bool IsGenericType - Истинно, если заданный тип является обобщенным. (Более подробно обобщения рассматриваются в главе 18.)

string Namespace - Получает пространство имен для заданного типа

Применение рефлексии

С помощью методов и свойств класса Туре можно получить подробные сведения о типе данных во время выполнения программы. Это довольно эффективное средство. Ведь получив сведения о типе данных, можно сразу же вызвать его конструкторы и методы или воспользоваться его свойствами. Следовательно, рефлексия позволяет использовать код, который не был доступен во время компиляции.

Прикладной интерфейс Reflection API весьма обширен и поэтому не может быть полностью рассмотрен в этой главе. Ведь для этого потребовалась бы целая книга! Но прикладной интерфейс Reflection API имеет ясную логическую структуру, а следовательно, уяснив одну его часть, нетрудно понять и все остальное. Принимая во внимание это обстоятельство, в последующих разделах демонстрируются четыре основных способа применения рефлексии: получение сведений о методах, вызов методов, конструирование объектов и загрузка типов данных из сборок.

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

<b>MethodInfo[] GetMethods()</b>

Этот метод возвращает массив объектов класса Methodlnfо, которые описывают методы, поддерживаемые вызывающим типом. Класс MethodInfo находится в пространстве имен System.Reflection.

Класс MethodInfo является производным от абстрактного класса MethodBase, который в свою очередь наследует от класса MemberInfо. Это дает возможность пользоваться всеми свойствами и методами, определенными в этих трех классах. Например, для получения имени метода служит свойство Name. Особый интерес вызывают два члена класса MethodInfo: ReturnType и GetParameters().

Возвращаемый тип метода находится в доступном только для чтения свойстве ReturnType, которое является объектом класса Туре.

Метод GetParameters() возвращает список параметров, связанных с анализируемым методом. Ниже приведена его общая форма.

<b>Parameterlnfо[] GetParameters();</b>

Сведения о параметрах содержатся в объекте класса ParameterInfо. В классе Parameterlnfо определено немало свойств и методов, описывающих параметры. Особое значение имеют два свойства: Name — представляет собой строку, содержащую имя параметра, a ParameterType — описывает тип параметра, который инкапсулирован в объекте класса Туре.

В качестве примера ниже приведена программа, в которой рефлексия используется для получения методов, поддерживаемых классом MyClass. В этой программе выводится возвращаемый тип и имя каждого метода, а также имена и типы любых параметров, которые может иметь каждый метод.

<b>// Анализ методов с помощью рефлексии.</b>

<b>using System;</b>

<b>using System.Reflection;</b>

<b>class MyClass {</b>

<b>  int x;</b>

<b>  int y;</b>

<b>  public MyClass(int i, int j) {</b>

<b>    x = i;</b>

<b>    y = j;</b>

<b>  }</b>

<b>  public int Sum() {</b>

<b>    return x + y;</b>

<b>  }</b>

<b>  public bool IsBetween(int i) {</b>

<b>    if (x &lt; i &amp;&amp; i &lt; y) return true;</b>

<b>    else return false;</b>

<b>  }</b>

<b>  public void Set(int a, int b) {</b>

<b>    x = a;</b>

<b>    y = b;</b>

<b>  }</b>

<b>  public void Set(double a, double b) {</b>

<b>    x = (int)a; y = (int)b;</b>

<b>  }</b>

<b>  public void Show() {</b>

<b>    Console.WriteLine(&quot; x: {0}, у: {1}&quot;, x, y);</b>

<b>  }</b>

<b>}</b>

<b>class ReflectDemo {</b>

<b>  static void Main() {</b>

<b>    Type t = typeof(MyClass); // получить объект класса Type,</b>

<b>    // представляющий класс MyClass</b>