Чтение онлайн

ЖАНРЫ

C# 4.0 полное руководство - 2011

Шилдт Герберт

Шрифт:

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

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

Parameterlnfо[] GetParameters;

Сведения о параметрах содержатся в объекте класса Parameter Inf о. В классе Parameterlnf о определено немало свойств и методов, описывающих параметры. Особое значение

имеют два свойства:
Name — представляет собой строку, содержащую имя параметра, a ParameterType — описывает тип параметра, который инкапсулирован в объекте класса Туре.

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

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

using System;

using System.Reflection;

class MyClass { int x; int y;

public MyClass(int i, int j) { x = i ;

У = j;

}

public int Sum { return x+y;

}

public bool IsBetween(int i) { if(x < i && i < y) return true; else return false;

}

public void Set(int a, int b) { x = a;

У = b;

}

public void Set(double a, double b) { x = (int) a; у = (int) b;

}

public void Show {

Console.WriteLine(" x: {0}, у: {1}", x, y);

}

}

class ReflectDemo { static void Main {

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

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

Console.WriteLine("Анализ методов, определенных " +

"в классе " + t.Name);

Console.WriteLine ;

Console.WriteLine("Поддерживаемые методы: ");

MethodInfo[] mi = t.GetMethods;

// Вывести методы, поддерживаемые в классе MyClass. foreach(Methodlnfo m in mi) {

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

Console.Write(" " + m.ReturnType.Name + " " + m.Name + "(");

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

Parameterlnfo[] pi = m.GetParameters ; for(int i=0; i < pi.Length; i++) {

Console.Write(pi[i].ParameterType.Name + " " + pi[i].Name); if(i+l < pi.Length) Console.Write(", ");

}

Console.WriteLine(")");

Console.WriteLine;

}

}

}

Эта программа дает следующий результат.

Поддерживаемые методы:

Int32 Sum

Boolean IsBetween (Int32 i)

Void Set(Int32 a, Int32 b)

Void Set (Double a, Double b)'

Void Show

String ToString

Boolean Equals(Object ob j )

Int32 GetHashCode

Type GetType

Как

видите, помимо методов, определенных в классе MyClass, в данной программе выводятся также методы, определенные в классе ob
j ect, поскольку все типы данных в C# наследуют от класса ob j ect. Кроме того, в качестве имен типов указываются имена структуры .NET. Обратите также внимание на то, что метод Set выводится дважды, поскольку он перегружается. Один из его вариантов принимает аргументы типа int, а другой — аргументы типа double.

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

Объект класса Туре, представляющий класс MyClass, создается в методе Main в следующей строке кода.

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

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

Напомним, что оператор typeof возвращает объект класса Туре, представляющий конкретный тип данных (в данном случае — класс MyClass).

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

MethodInfo[] mi = t.GetMethods;

Затем в цикле foreach организуется обращение к элементам массива mi. На каждом шаге этого цикла выводится возвращаемый тип, имя и параметры отдельного метода, как показано в приведенном ниже фрагменте кода.

foreach(Methodlnfo m in mi) {

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

Console.Write(" " + m.ReturnType.Name + " " + m.Name + "(");

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

Parameterlnfo[] pi = m.GetParameters; for(int i=0; i < pi.Length; i++) {

Console.Write(pi[i].ParameterType.Name + " " + pi[i].Name); if(i+1 < pi.Length) Console.Write(", ");

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

Вторая форма метода GetMethods

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

Methodlnfo[] GetMethods(BindingFlags флажки)

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

Поделиться с друзьями: