Прочитать на английском

Поделиться через


Класс System.Type

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

Класс Type является корнем System.Reflection функциональности и является основным способом доступа к метаданным. Используйте элементы Type для получения сведений о объявлении типа, о членах типа (например, конструкторах, методах, полях, свойствах и событиях класса), а также модуле и сборке, в которой развертывается класс.

Никакие разрешения не требуются для использования отражения для получения сведений о типах и их членах независимо от их уровней доступа. Никакие разрешения не требуются для использования отражения для доступа к общедоступным членам или другим членам, уровни доступа которых будут отображаться во время обычной компиляции. Однако, чтобы код использовал отражение для доступа к членам, которые обычно будут недоступны, такие как частные или внутренние методы, или защищенные поля класса не наследуются, код должен иметь .ReflectionPermission Сведения о безопасности см. в разделе "Вопросы безопасности" для Рефлексия.

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

Примечание

В многопоточных сценариях не блокируйте Type объекты для синхронизации доступа к static данным. Другой код, над которым у вас нет элемента управления, также может заблокировать тип класса. Это может привести к взаимоблокировке. Вместо этого синхронизируйте доступ к статическим данным путем блокировки частного static объекта.

Примечание

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

Примечание

Интерфейсы, расширяющие другие интерфейсы, не наследуют методы, определенные в расширенных интерфейсах.

Какие типы представляет объект Type?

Этот класс является потокобезопасной; Несколько потоков могут одновременно считываться из экземпляра этого типа. Экземпляр Type класса может представлять любой из следующих типов:

  • Классы
  • Типы значений
  • Массивы
  • Интерфейсы
  • Перечисления
  • Делегаты
  • Созданные универсальные типы и определения универсальных типов
  • Аргументы типов и параметры типов созданных универсальных типов, определений универсальных типов и универсальных определений методов

Получение объекта Type

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

  • Метод экземпляра Object.GetType возвращает Type объект, представляющий тип экземпляра. Так как все управляемые типы являются производными, ObjectGetType метод может вызываться для экземпляра любого типа.

    В следующем примере метод вызывается Object.GetType для определения типа среды выполнения каждого объекта в массиве объектов.

    C#
    object[] values = { "word", true, 120, 136.34, 'a' };
    foreach (var value in values)
        Console.WriteLine("{0} - type {1}", value,
                          value.GetType().Name);
    
    // The example displays the following output:
    //       word - type String
    //       True - type Boolean
    //       120 - type Int32
    //       136.34 - type Double
    //       a - type Char
    
  • Статические Type.GetType методы возвращают Type объект, представляющий тип, заданный его полным именем.

  • Объекты Module.GetTypes, Module.GetTypeа также Module.FindTypes методы возвращают Type объекты, представляющие типы, определенные в модуле. Первый метод можно использовать для получения массива объектов для всех общедоступных и частных Type типов, определенных в модуле. (Экземпляр Module можно получить через Assembly.GetModule или Assembly.GetModules метод или через Type.Module свойство.)

  • Объект System.Reflection.Assembly содержит ряд методов для получения классов, определенных в сборке, включая Assembly.GetType, Assembly.GetTypesи Assembly.GetExportedTypes.

  • Метод FindInterfaces возвращает отфильтрованный список типов интерфейсов, поддерживаемых типом.

  • Метод GetElementType возвращает Type объект, представляющий элемент.

  • Возвращаемые GetInterfacesType объекты и GetInterface методы, представляющие типы интерфейса, поддерживаемые типом.

  • Метод GetTypeArray возвращает массив Type объектов, представляющих типы, заданные произвольным набором объектов. Объекты указываются с массивом типов Object.

  • Для GetTypeFromProgID взаимодействия COM предоставляются методы и GetTypeFromCLSID методы. Они возвращают Type объект, представляющий тип, заданный или ProgIDCLSID.

  • Метод GetTypeFromHandle предоставляется для взаимодействия. Он возвращает Type объект, представляющий тип, заданный дескриптором класса.

  • Оператор C# typeof , оператор C++ typeid и оператор Visual Basic GetType получают Type объект для типа.

  • Метод MakeGenericType возвращает объект, представляющий созданный универсальный тип, который является открытым созданным типом, если его ContainsGenericParameters свойство возвращается Typetrue, и закрытый созданный тип в противном случае. Универсальный тип можно создать экземпляр только в том случае, если он закрыт.

  • Методы MakeArrayTypeи MakeByRefType методы возвращают Type объекты, представляющие соответственно массив указанного типа, указатель на указанный тип и тип ссылочного параметра (refв C#, byref" в F#, ByRefMakePointerTypeв Visual Basic).

Сравнение объектов типов для равенства

Type Объект, представляющий тип, является уникальным; то есть два Type ссылки на объекты ссылаются на один и тот же объект, если и только если они представляют один и тот же тип. Это позволяет сравнивать Type объекты с помощью ссылочного равенства. В следующем примере сравниваются Type объекты, представляющие ряд целых значений, чтобы определить, являются ли они одинаковыми типами.

C#
long number1 = 1635429;
int number2 = 16203;
double number3 = 1639.41;
long number4 = 193685412;

// Get the type of number1.
Type t = number1.GetType();

// Compare types of all objects with number1.
Console.WriteLine("Type of number1 and number2 are equal: {0}",
                  Object.ReferenceEquals(t, number2.GetType()));
Console.WriteLine("Type of number1 and number3 are equal: {0}",
                  Object.ReferenceEquals(t, number3.GetType()));
Console.WriteLine("Type of number1 and number4 are equal: {0}",
                  Object.ReferenceEquals(t, number4.GetType()));

// The example displays the following output:
//       Type of number1 and number2 are equal: False
//       Type of number1 and number3 are equal: False
//       Type of number1 and number4 are equal: True