Московский государственный университет имени М.В.Ломоносова
Опубликован: 01.11.2004 | Доступ: свободный | Студентов: 11276 / 456 | Оценка: 4.12 / 4.01 | Длительность: 19:20:00
ISBN: 978-5-9556-0077-9
Специальности: Программист
Лекция 17:

C#. Индексаторы класса и атрибуты

< Лекция 16 || Лекция 17: 1234 || Лекция 18 >

Класс Type

Класс System.Type имеет следующее формальное описание:

public abstract class Type : MemberInfo, IReflect.

Две ссылки типа Type на объект будут ссылаться на один и тот же объект только в том случае, если они представляют одинаковый тип.

Экземпляр типа Type может быть представлен любым из следующих типов:

  • классы;
  • размерные типы (Value types) ;
  • массивы;
  • интерфейсы;
  • указатели;
  • нумераторы.

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

  • метод Object.GetType возвращает объект Type, представляющий тип экземпляра объекта;
  • статический метод GetType возвращает объект Type, который представляет тип, указанный посредством своего полного имени;
  • методы Module.GetTypes, Module.GetType, и Module.FindTypes возвращают объект Type, который представляет типы, определенные в модуле. Метод GetTypes позволяет получить массив объектов для всех общедоступных и защищенных типов, определенных в модуле;
  • метод FindInterfaces возвращает отфильтрованный список интерфейсов типов, которые поддерживаются данным типом;
  • метод GetElementType возвращает объект Type, который представляет элемент;
  • методы GetInterfaces и GetInterface возвращают объект Type, который представляет интерфейс, поддерживаемый типом;
  • метод GetTypeArray возвращает массив объектов Type, которые представляют типы, заданные посредством набора объектов;
  • методы GetTypeFromProgIDи GetTypeFromCLSID возвращают объект Type, который указывается через ProgID или CLSID (методы предоставляются для совместимости с СОМ);
  • метод GetTypeFromHandle возвращает объект Type, который указывается посредством дескриптора (метод предоставляется для совместимости);
  • оператор typeof получает объект Type для указанного типа.

Метаданные - это информация о выполнимом модуле, получаемая во время выполнения приложения. К такой информации относятся и данные о типе. В случае неправильного указания имени типа возникает исключение. Поэтому указание типа следует заключать в блок try-catch.

Например:

try
 {
   Type tp=Type.GetType(s);
Console.WriteLine("Имя типа : {0}",tp.FullName);
  }
catch (System.NullReferenceException)
         {Console.WriteLine("Ошибка задания типа");}

Класс Type предоставляет большой набор свойств для запроса информации по типу, включая следующие:

  • FullName - возвращает имя типа;
  • IsClass - определяет, является ли тип классом;
  • IsAbstract - определяет, является ли тип абстрактным классом;
  • IsNestedPublic - определяет, является ли тип вложенным и общедоступным;
  • IsPublic - определяет, является ли данный тип общедоступным;
  • IsNotPublic - определяет, является ли данный тип защищенным;
  • IsSealed - определяет, является ли тип конечным (не может быть базовым классом);
  • IsArray - определяет, представляет ли указанный тип массив;
  • GUID - возвращает значение типа GUID, ассоциированное с данным типом (такое значение хранится в реестре Windows).

    Например:

    Type myType = typeof(MyClass1);  
    Guid myGuid =(Guid) myType.GUID;
  • IsNestedAssembly - определяет, является ли тип вложенным и видимым только в своей собственной сборке;
  • Module - возвращает модуль (DLL) в котором объявлен данный тип;
  • Namespace - возвращает пространство имен, содержащее данный тип;

Свойство IsByRef позволяет определить, передается ли указанный элемент по типу, а свойство Assembly определяет сборку.

Например:

Type tp=Type.GetType(s);
Console.WriteLine("\tПередается по ссылке ? : {0}",tp.IsByRef);

Получение информации о методах

Используя метод GetMethods, можно получить информацию о методах. Такая информация заносится в массив типа MethodInfo.

Например:

public static void Main() 
 {
  Type myType =(typeof(MyClass1));
  // Получить методы с доступом public
   MethodInfo[] myArrMethodInfo = 
           myType.GetMethods(BindingFlags.Public  
                          |BindingFlags.Instance 
                          |BindingFlags.DeclaredOnly);
   Console.WriteLine("\n Число методов public =:"
                    +myArrMethodInfo.Length);
   Console.WriteLine("Имена методов public : ");
   // Отобразить имена всех методов
   MyPrintMethodInfo(myArrMethodInfo);
  // Получить методы с защищенным доступом
   MethodInfo[] myArrMethodInfo1 = 
           myType.GetMethods(BindingFlags.NonPublic 
                         |BindingFlags.Instance 
                         |BindingFlags.DeclaredOnly);
   Console.WriteLine("\n Число защищенных методов:" 
                       +myArrMethodInfo1.Length);
 }
 public static void MyPrintMethodInfo(MethodInfo[] a)
 {
   for(int i=0;i<a.Length;i++)
   {
   MethodInfo myMethodInfo = (MethodInfo)a[i];
   Console.WriteLine("\n" + myMethodInfo.Name);
   }
 }
Листинг 17.2.

< Лекция 16 || Лекция 17: 1234 || Лекция 18 >
Александр Демьяненко
Александр Демьяненко

Можно ли сдавать один и тот же тест несколько раз?
Или же один и тот же тест можно сдать лишь однажды?

Максим Стогний
Максим Стогний

Добрый день!

Скажите, пожалуйста, если в терминологии объектно-ориентированного программирования функции также называются методами или методами - членами класса, в примере объявления указателя на метод использовали в формальном описании оба названия:

тип_метода (имя_класса::*имя_метода_указателя)
    (список параметров);
тип_функции (*имя_ функции_указателя)
    (список параметров);

при этом можно было  тип_функции во втором описании заменить на тип_метода? Т.е.:

тип_метода (*имя_ метода_указателя)
    (список параметров);