В этой статье приводятся дополнительные замечания к справочной документации по этому 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 (varvaluein 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 свойство.)
Метод 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
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
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Отзыв о .NET
.NET — это проект с открытым исходным кодом. Выберите ссылку, чтобы оставить отзыв:
Присоединитесь к серии встреч для создания масштабируемых решений искусственного интеллекта на основе реальных вариантов использования с другими разработчиками и экспертами.