Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье приводятся дополнительные замечания к справочной документации по этому 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 BasicGetType
получаютType
объект для типа.Метод MakeGenericType возвращает объект, представляющий сконструированный универсальный тип, который является открытым типом, если его свойство ContainsGenericParameters возвращает
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: {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