Отражение
(reflection) — это способность получать информацию о типе в период исполнения. Эта информация включает имена типов, классов и элементы структур. В .NET Framework эта функциональность связана с классом
System. Type.
Этот класс — корень всех операторов отражения и может быть получен с помощью оператора
typeof.
Сейчас мы не будем вникать в подробности отражения (этим мы займемся в главе 16), но вот простой пример, иллюстрирующий простоту применения оператора
typeof
'для получения практически любой информации о типе или объекте во время исполнения программы:
using System;
using System.Reflection;
public class Apple {
public int nSeeds;
public void Ripen()
{
> >
public class TypeOfApp {
public static void Main() {
Type t = typeof(Apple);
string className = t.ToStringO;
Console.ИгШипе("\пИнформация
0
классе {О}", className);
Console.WriteLine("\nMeroflH {0}", className); Console. WriteLine("————————"); Methodlnfo[] methods = t.GetMethodsO;
foreach (Methodlnfo method in methods)
{
Console.WriteLine(method.ToSt ring());
}
Console.WriteLine("\nBce члены {О}", className); Console. Writel_ine("————————"); Memberlnfo[] allMembers = t.GetMembersO; foreach (Memberlnfo member in allMembers)
{
Console. WriteLine(member.ToStringO);
} > }
В этой программе содержится класс
Apple,
у которого всего два члена: поле
nSeeds
и метод
Ripen.
Сначала, используя оператор
typeof
и имя класса, я получаю объект
System. Type,
который затем сохраняется в переменной
t. С
этого момента я могу использовать объект
System. Type
для получения всех методов и членов класса
Apple.
Это делается с помощью методов
GetMethods
и
GetMembers
соответственно. Результаты выполнения этих методов выводятся на стандартное устройство вывода следующим образом:
Информация о классе Apple Методы Apple
Int32 GetHashCodeQ
Boolean Equals(System.Object)
System.String ToStringQ
Void RipenO
System.Type GetTypeO
Все члены Apple
Int32 nSeeds
Int32 GetHashCodeO
Boolean Equals(System.Object)
System.String ToStringO
Void RipenO
System.Type GetTypeO
Void .ctorO
Прежде чем двигаться дальше, хочу сделать два замечания. Во-первых, обратите внимание, что выводятся и унаследованные члены класса. Так как класс не порожден явно из другого класса, мы знаем, что все члены, не определенные в классе
Apple
наследуются от неявного базового класса
System.Object.
Во-вторых, объект
System.Type
можно получить методом
GetType.
Этот наследуемый от
System.Object
метод позволяет работать с объектами, а не с классами. Любой из двух приведенных далее фрагментов можно использовать для получения объекта
System. Type.
II
Получение объекта System.Type на основе определения класса. Type t1 = typeof(Apple);
// Получение объекта System.Type из объекта. Apple apple = new AppleQ; Type t2 = apple.GetTypeO;