Класс 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 объект, представляющий тип, заданный или
ProgID
CLSID
.Метод GetTypeFromHandle предоставляется для взаимодействия. Он возвращает
Type
объект, представляющий тип, заданный дескриптором класса.Оператор C#
typeof
, оператор C++typeid
и оператор Visual BasicGetType
получаютType
объект для типа.Метод MakeGenericType возвращает объект, представляющий созданный универсальный тип, который является открытым созданным типом, если его ContainsGenericParameters свойство возвращается Type
true
, и закрытый созданный тип в противном случае. Универсальный тип можно создать экземпляр только в том случае, если он закрыт.Методы MakeArrayTypeи MakeByRefType методы возвращают Type объекты, представляющие соответственно массив указанного типа, указатель на указанный тип и тип ссылочного параметра (
ref
в C#, byref" в F#,ByRef
MakePointerTypeв 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