Принципы объектно-ориентированного программирования

         

Отражение



typeof

Отражение (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;



Содержание раздела