Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье приводятся дополнительные замечания к справочной документации по этому 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 Charlet 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 CharModule 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 возвращает объект, представляющий сконструированный универсальный тип, который является открытым типом, если его свойство Type возвращает ContainsGenericParameters, и закрытым типом в противном случае. Универсальный тип можно создать экземпляр только в том случае, если он закрыт.
Методы MakeArrayTypeи MakePointerType методы возвращают MakeByRefType объекты, представляющие соответственно массив указанного типа, указатель на указанный тип и тип ссылочного параметра (Typeв C#, byref" в F#,
refByRefв 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