Compartir a través de


Reflexión en .NET

Las clases del System.Reflection espacio de nombres, junto con System.Type, permiten obtener información sobre los ensamblados cargados y los tipos definidos en ellos, como clases, interfaces y tipos de valor (es decir, estructuras y enumeraciones). También puede usar la reflexión para crear instancias de tipo en tiempo de ejecución e invocarlas y acceder a ellas.

Los ensamblados contienen módulos, los módulos contienen tipos, y los tipos contienen miembros. La reflexión proporciona objetos que encapsulan ensamblados, módulos y tipos. Puede usar la reflexión para crear dinámicamente una instancia de un tipo, enlazar el tipo a un objeto existente o obtener el tipo de un objeto existente. A continuación, puede invocar los métodos del tipo o acceder a sus campos y propiedades. Entre los usos típicos de la reflexión se incluyen los siguientes:

  • Use Assembly para definir y cargar ensamblados, cargar módulos que aparecen en el manifiesto de ensamblado y localizar un tipo de este ensamblado y crear una instancia de él.
  • Use Module para detectar información como el ensamblado que contiene el módulo y las clases del módulo. También puede obtener todos los métodos globales u otros métodos no globales específicos definidos en el módulo.
  • Use ConstructorInfo para detectar información como el nombre, los parámetros, los modificadores de acceso (como public o private) y los detalles de implementación (como abstract o virtual) de un constructor. Use el método GetConstructors o GetConstructor de Type para invocar un constructor específico.
  • Use MethodInfo para detectar información como el nombre, el tipo de valor devuelto, los parámetros, los modificadores de acceso y los detalles de implementación (como abstract o virtual) de un método. Use el método GetMethods o GetMethod de un Type para invocar un método específico.
  • Use FieldInfo para detectar información como el nombre, los modificadores de acceso y los detalles de implementación (como static) de un campo y para obtener o establecer valores de campo.
  • Use EventInfo para detectar información como el nombre, el tipo de datos del controlador de eventos, los atributos personalizados, la declaración de tipo y el tipo reflejado de un evento, y para agregar o quitar controladores de eventos.
  • Use PropertyInfo para detectar información, como el nombre, el tipo de datos, la declaración de tipo, el tipo reflejado y el estado de solo lectura o de escritura de una propiedad, así como para obtener o establecer los valores de la propiedad.
  • Use ParameterInfo para detectar información como el nombre de un parámetro, el tipo de datos, si un parámetro es un parámetro de entrada o salida, y la posición del parámetro en una firma de método.
  • Use CustomAttributeData para detectar información sobre los atributos personalizados cuando se trabaja en el contexto de MetadataLoadContext o de solo reflexión (.NET Framework). CustomAttributeData permite examinar atributos sin crear instancias de ellos.

Las clases del System.Reflection.Emit espacio de nombres proporcionan una forma especializada de reflexión que permite compilar tipos en tiempo de ejecución.

La reflexión también se puede usar para crear exploradores de tipos, que permiten a los usuarios seleccionar tipos y, a continuación, ver la información sobre esos tipos.

Hay otros usos para la reflexión. Los compiladores para lenguajes como JScript usan la reflexión para construir tablas de símbolos. Las clases en el espacio de nombres System.Runtime.Serialization utilizan reflexión para acceder a los datos y determinar qué campos persistir. Las clases del System.Runtime.Remoting espacio de nombres usan la reflexión indirectamente a través de la serialización.

Tipos de tiempo de ejecución en reflexión

La reflexión proporciona clases, como Type y MethodInfo, para representar tipos, miembros, parámetros y otras entidades de código. Sin embargo, cuando se usa la reflexión, no se trabaja directamente con estas clases, la mayoría de las cuales son abstractas (MustInherit en Visual Basic). En su lugar, se trabaja con tipos proporcionados por Common Language Runtime (CLR).

Por ejemplo, cuando se usa el operador de C# typeof (GetType en Visual Basic) para obtener un Type objeto , el objeto es realmente un RuntimeType. RuntimeType deriva de Type y proporciona implementaciones de todos los métodos abstractos.

Estas clases en tiempo de ejecución son internal (Friend en Visual Basic). No se documentan por separado de sus clases base, ya que su comportamiento se describe en la documentación de la clase base.

Referencia