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


Класс System.Type

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

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

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

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

Примечание.

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

Примечание.

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

Примечание.

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

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

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

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

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

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

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

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

    object[] values = { "word", true, 120, 136.34, 'a' };
    foreach (var value in values)
        Console.WriteLine($"{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
    
    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 объект, представляющий элемент.

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

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

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

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

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

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

  • Методы 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: {Object.ReferenceEquals(t, number2.GetType())}");
Console.WriteLine($"Type of number1 and number3 are equal: {Object.ReferenceEquals(t, number3.GetType())}");
Console.WriteLine($"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
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