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 RuntimeTypederivada . 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 del ModuleAssembly.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 ProgIDCLSID.

  • 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 Basic GetType obtienen el Type 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 truey 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