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


Класс System.Type

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

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

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

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

Примечание.

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

Примечание.

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

Примечание.

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

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

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

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

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

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

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

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

    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
    
    let values: obj[] = [| "word"; true; 120; 136.34; 'a' |]
    for value in values do
       printfn $"{value} - type {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
    
    Module Example1
       Public Sub Main()
          Dim values() As Object = { "word", True, 120, 136.34, "a"c }
          For Each value In values
             Console.WriteLine("{0} - type {1}", value, 
                               value.GetType().Name)
          Next
       End Sub
    End Module
    ' 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 объекты, представляющие ряд целых значений, чтобы определить, являются ли они одинаковыми типами.

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
let number1 = 1635429L
let number2 = 16203
let number3 = 1639.41
let number4 = 193685412L

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

// Compare types of all objects with number1.
printfn $"Type of number1 and number2 are equal: {Object.ReferenceEquals(t, number2.GetType())}"
printfn $"Type of number1 and number3 are equal: {Object.ReferenceEquals(t, number3.GetType())}"
printfn $"Type of number1 and number4 are equal: {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
Module Example
   Public Sub Main()
      Dim number1 As Long = 1635429
      Dim number2 As Integer = 16203
      Dim number3 As Double = 1639.41
      Dim number4 As Long = 193685412
      
      ' Get the type of number1.
      Dim t As Type = 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()))
   End Sub
End Module
' 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