Clase System.Type
En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.
La Type clase es la raíz de la System.Reflection funcionalidad y es la forma principal de acceder a los metadatos. Use los miembros de Type para obtener información sobre una declaración de tipo, sobre los miembros de un tipo (como los constructores, métodos, campos, propiedades y eventos de una clase), así como el módulo y el ensamblado en el que se implementa la clase.
No se requieren permisos para que el código use la reflexión para obtener información sobre los tipos y sus miembros, independientemente de sus niveles de acceso. No se requieren permisos para que el código use la reflexión para acceder a miembros públicos u otros miembros cuyos niveles de acceso los harían visibles durante la compilación normal. Sin embargo, para que el código use la reflexión para acceder a los miembros que normalmente serían inaccesibles, como métodos privados o internos, o campos protegidos de un tipo que la clase no hereda, el código debe tener ReflectionPermission. Consulte Consideraciones de seguridad para Reflexiones ion.
Type
es una clase base abstracta que permite varias implementaciones. El sistema siempre proporcionará la clase RuntimeType
derivada . En la reflexión, todas las clases que comienzan con la palabra Runtime solo se crean una vez por objeto en el sistema y admiten operaciones de comparación.
Nota:
En escenarios de multithreading, no bloquee Type objetos para sincronizar el acceso a los static
datos. Otro código, sobre el que no tiene ningún control, también puede bloquear el tipo de clase. Esto podría dar lugar a un interbloqueo. En su lugar, sincronice el acceso a los datos estáticos bloqueando un objeto privado static
.
Nota:
Una clase derivada puede acceder a los miembros protegidos de las clases base del código de llamada. Además, se permite el acceso a los miembros del ensamblado del código de llamada. Como regla, si se permite el acceso en el código enlazado en tiempo de ejecución, también se le permite el acceso en código enlazado en tiempo de ejecución.
Nota:
Las interfaces que extienden otras interfaces no heredan los métodos definidos en las interfaces extendidas.
¿Qué tipos representa un objeto Type?
Esta clase es segura para subprocesos; varios subprocesos pueden leer simultáneamente desde una instancia de este tipo. Una instancia de la Type clase puede representar cualquiera de los siguientes tipos:
- Clases
- Tipos de valor
- Matrices
- Interfaces
- Enumeraciones
- Delegados
- Tipos genéricos construidos y definiciones de tipos genéricos
- Argumentos de tipo y parámetros de tipo de tipos genéricos construidos, definiciones de tipos genéricos y definiciones de métodos genéricos
Recuperar un objeto Type
El Type objeto asociado a un tipo determinado se puede obtener de las siguientes maneras:
El método de instancia Object.GetType devuelve un Type objeto que representa el tipo de una instancia. Dado que todos los tipos administrados derivan de Object, se puede llamar al GetType método en una instancia de cualquier tipo.
En el ejemplo siguiente se llama al Object.GetType método para determinar el tipo en tiempo de ejecución de cada objeto de una matriz de objetos.
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
Los métodos estáticos Type.GetType devuelven un Type objeto que representa un tipo especificado por su nombre completo.
Los Module.GetTypesmétodos , Module.GetTypey Module.FindTypes devuelven
Type
objetos que representan los tipos definidos en un módulo. El primer método se puede usar para obtener una matriz de Type objetos para todos los tipos públicos y privados definidos en un módulo. (Puede obtener una instancia de a través delModule
Assembly.GetModule método o Assembly.GetModules o a través de la Type.Module propiedad ).El System.Reflection.Assembly objeto contiene una serie de métodos para recuperar las clases definidas en un ensamblado, incluidos Assembly.GetType, Assembly.GetTypesy Assembly.GetExportedTypes.
El FindInterfaces método devuelve una lista filtrada de tipos de interfaz admitidos por un tipo.
El GetElementType método devuelve un
Type
objeto que representa el elemento .Los GetInterfaces métodos y GetInterface devuelven Type objetos que representan los tipos de interfaz admitidos por un tipo.
El GetTypeArray método devuelve una matriz de Type objetos que representa los tipos especificados por un conjunto arbitrario de objetos. Los objetos se especifican con una matriz de tipo Object.
Los GetTypeFromProgID métodos y GetTypeFromCLSID se proporcionan para la interoperabilidad COM. Devuelven un Type objeto que representa el tipo especificado por o
ProgID
CLSID
.El GetTypeFromHandle método se proporciona para la interoperabilidad. Devuelve un
Type
objeto que representa el tipo especificado por un identificador de clase.El operador de C#
typeof
, el operador de C++typeid
y el operador de Visual BasicGetType
obtienen elType
objeto de un tipo.El MakeGenericType método devuelve un Type objeto que representa un tipo genérico construido, que es un tipo construido abierto si su ContainsGenericParameters propiedad devuelve
true
y un tipo construido cerrado de lo contrario. Solo se puede crear una instancia de un tipo genérico si está cerrado.Los MakeArrayTypemétodos , MakePointerTypey MakeByRefType devuelven Type objetos que representan, respectivamente, una matriz de un tipo especificado, un puntero a un tipo especificado y el tipo de un parámetro de referencia (
ref
en C#, "byref" en F#,ByRef
en Visual Basic).
Comparar objetos de tipo para obtener igualdad
Un Type objeto que representa un tipo es único; es decir, dos Type referencias de objeto hacen referencia al mismo objeto si y solo si representan el mismo tipo. Esto permite la comparación de objetos mediante la igualdad de Type referencia. En el ejemplo siguiente se comparan los Type objetos que representan un número de valores enteros para determinar si son del mismo tipo.
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