Российский Государственный Технологический Университет им. К.Э. Циолковского
Опубликован: 02.03.2007 | Доступ: свободный | Студентов: 5636 / 790 | Оценка: 3.96 / 3.45 | Длительность: 27:04:00
ISBN: 978-5-9556-0086-4
Лекция 10:

Атрибуты, сборки, рефлексия

Аннотация: Рефлексия представляет собой процесс анализа типов (структуры типов) в ходе выполнения приложения (сборки). В .NET рефлексия реализуется свойствами и методами класса System.Type и классов пространства имен System.Reflection

Рефлексия (Reflection) – предоставление выполняемому коду информации о нем самом.

Рефлексия представляет собой процесс анализа типов (структуры типов) в ходе выполнения приложения (сборки). В .NET рефлексия реализуется свойствами и методами класса System.Type и классов пространства имен System.Reflection.

Пространство имен System.Reflection

Пространство имен System.Reflection содержит классы и интерфейсы, которые позволяют организовать просмотр загруженных в сборку типов, методов, полей (данных-членов) и обеспечивают динамические механизмы реализации типов и вызова методов.

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

System.Reflection определяет типы для организации позднего связывания и динамической загрузки типов.

Неполный перечень классов представлен ниже:

Тип Назначение
Assembly Методы для загрузки, описания и выполнения разнообразных операций над сборкой
AssemblyName Информация о сборке (идентификатор, версия, язык реализации)
EventInfo Информация о событиях
FieldInfo Информация о полях
MemberInfo Абстрактный базовый класс, определяющий общие члены для EventInfo, FieldInfo, MethodInfo, PropertyInfo
MethodInfo Информация о методе
Module Позволяет обратиться к модулю в многофайловой сборке
ParameterInfo Информация о параметре
PropertyInfo Информация о свойстве

Класс System.Type

Класс System.Type содержит методы, позволяющие получать информацию о типах приложения. Является основой для реализации функциональности пространства имен System.Reflection и средством для получения доступа к метаданным.

Использование членов класса Type позволяет получить информацию о:

  • типе ( GetType(string) );
  • конструкторах ( GetConstructors() );
  • методах ( GetMethods() );
  • данных-членах ( GetFields() );
  • свойствах ( GetProperties() );
  • событиях, объявленных в классе ( GetEvents() );
  • модуле;
  • сборке, в которой реализуется данный класс.

Объект — представитель класса Type уникален. Две ссылки на объекты — представители класса Type оказываются эквивалентными, если только объекты были созданы в результате обращения к одному и тому же типу.

Объект — представитель класса Type может представить любой из следующих типов:

  • классы;
  • типы-значения;
  • массивы;
  • интерфейсы;
  • указатели;
  • перечисления.

Ссылка на объект — представитель класса Type, ассоциированная с некоторым типом, может быть получена одним из следующих способов.

  1. В результате вызова метода
    Type Object.GetType()

    (метода — члена класса Object ), который возвращает ссылку на объект — представитель типа Type, представляющий информацию о типе. Вызов производится от имени объекта — представителя данного типа. Вызов становится возможен в связи с тем, что любой класс наследует тип Object.

  2. В результате вызова статического метода — члена класса Type
    public static Type Type.GetType(string)

    параметром является строка со значением имени типа. Возвращает объект — представитель класса Type, с информацией о типе, специфицированном параметром метода.

  3. От имени объекта — представителя класса Assembly — от имени объекта-сборки (самоописываемого, многократно используемого, версифицируемого БЛОКА (фрагмента) CLR-приложения) вызываются методы
    Type[] Assembly.GetTypes()
    Type Assembly.GetType(string)
    
    // Получаем ссылку на сборку, содержащую объявление типа MyType,
    // затем – массив объектов - представителей класса Type.
    Type[] types = (Assembly.GetAssembly(typeof(MyType))).GetTypes();
    // Без комментариев.
    Type tt = (Assembly.GetAssembly(typeof(MyType))).GetType("MyType");

    Здесь используется операция typeof. Операндом этой унарной операции является обозначение класса (в буквальном смысле – имя класса).

    class MyType
    {
    :::::
    }
    
    :::::
    Type t = typeof(MyType);
  4. От имени объекта – представителя класса Module (модуль – portable executable файл с расширением .dll или .exe, состоящий из одного и более классов и интерфейсов):
    Type[] Module.GetTypes()
    Type Module.GetType(string)
    Type[] Module.FindTypes(TypeFilter filter, object filterCriteria)

    где TypeFilter – класс-делегат.

  5. В результате выполнения операции typeof(), которая применяется для построения объекта-представителя класса System.Type. Выражение, построенное на основе операции typeof, имеет следующий вид:
    typeof(type)

    Операнд выражения – тип, для которого может быть построен объект – представитель класса System.Type.

    Пример применения операции:

    using System;
    using System.Reflection;
    
    public class MyClass 
    {
    public int intI;
    public void MyMeth() 
    {
     }
    
    public static void Main() 
    {
    Type t = typeof(MyClass);
    // Альтернативная эквивалентная конструкция
    // MyClass t1 = new MyClass();
    // Type t = t1.GetType();
    
    MethodInfo[] x = t.GetMethods();
    foreach (MethodInfo m in x) 
    {
    Console.WriteLine(m.ToString());
     }
    
    Console.WriteLine();
    MemberInfo[] x2 = t.GetMembers();
    foreach (MemberInfo m in x2) 
    {
    Console.WriteLine(m.ToString());
     }
     }
    }
kewezok kewezok
kewezok kewezok
Елена Шляхт
Елена Шляхт
Объясните плиз в чем отличие а++ от ++а
Почему результат разный?
int a=0, b=0;
Console.WriteLine(a++); //0
Console.WriteLine(++b); //1
a++;
++b;
Console.WriteLine(a); //2
Console.WriteLine(b); //2