La reflexión en C# es una característica poderosa que permite a los programas inspeccionar y manipular su propia estructura y comportamiento en tiempo de ejecución. Esto incluye la capacidad de examinar tipos, métodos, propiedades y otros miembros de las clases, así como crear instancias de tipos y llamar métodos de manera dinámica.
Conceptos Clave
- Namespace
System.Reflection
: La mayoría de las clases y métodos relacionados con la reflexión se encuentran en este namespace. - Tipos de Datos: La reflexión permite trabajar con tipos de datos en tiempo de ejecución.
- Métodos y Propiedades: Puedes obtener información sobre métodos y propiedades de un tipo.
- Instanciación Dinámica: Crear instancias de tipos en tiempo de ejecución.
- Invocación de Métodos: Llamar métodos de manera dinámica.
Ejemplo Práctico
Inspección de un Tipo
Vamos a inspeccionar un tipo simple para ver sus métodos y propiedades.
using System; using System.Reflection; public class Persona { public string Nombre { get; set; } public int Edad { get; set; } public void Saludar() { Console.WriteLine($"Hola, mi nombre es {Nombre} y tengo {Edad} años."); } } class Program { static void Main() { Type tipo = typeof(Persona); Console.WriteLine("Propiedades de la clase Persona:"); foreach (PropertyInfo propiedad in tipo.GetProperties()) { Console.WriteLine($"- {propiedad.Name} ({propiedad.PropertyType})"); } Console.WriteLine("\nMétodos de la clase Persona:"); foreach (MethodInfo metodo in tipo.GetMethods()) { Console.WriteLine($"- {metodo.Name}"); } } }
Explicación del Código
- Namespace
System.Reflection
: Importamos el namespace necesario para trabajar con reflexión. - Clase
Persona
: Definimos una clase simple con propiedades y un método. - Obtener Tipo: Usamos
typeof(Persona)
para obtener el tipo de la clasePersona
. - Propiedades: Iteramos sobre las propiedades del tipo usando
GetProperties()
. - Métodos: Iteramos sobre los métodos del tipo usando
GetMethods()
.
Salida Esperada
Propiedades de la clase Persona: - Nombre (System.String) - Edad (System.Int32) Métodos de la clase Persona: - get_Nombre - set_Nombre - get_Edad - set_Edad - Saludar - ToString - Equals - GetHashCode - GetType
Ejercicio Práctico
Ejercicio 1: Inspección de un Tipo Personalizado
Crea una clase llamada Vehiculo
con las siguientes propiedades y métodos:
- Propiedades:
Marca
(string),Modelo
(string),Año
(int). - Métodos:
MostrarInfo()
que imprime la información del vehículo.
Usa la reflexión para listar todas las propiedades y métodos de la clase Vehiculo
.
Solución
using System; using System.Reflection; public class Vehiculo { public string Marca { get; set; } public string Modelo { get; set; } public int Año { get; set; } public void MostrarInfo() { Console.WriteLine($"Marca: {Marca}, Modelo: {Modelo}, Año: {Año}"); } } class Program { static void Main() { Type tipo = typeof(Vehiculo); Console.WriteLine("Propiedades de la clase Vehiculo:"); foreach (PropertyInfo propiedad in tipo.GetProperties()) { Console.WriteLine($"- {propiedad.Name} ({propiedad.PropertyType})"); } Console.WriteLine("\nMétodos de la clase Vehiculo:"); foreach (MethodInfo metodo in tipo.GetMethods()) { Console.WriteLine($"- {metodo.Name}"); } } }
Retroalimentación
- Error Común: Olvidar importar el namespace
System.Reflection
. - Consejo: Asegúrate de que las propiedades y métodos de la clase estén correctamente definidos antes de intentar inspeccionarlos con reflexión.
Conclusión
La reflexión es una herramienta poderosa en C# que permite a los desarrolladores inspeccionar y manipular tipos en tiempo de ejecución. Aunque puede ser compleja, su comprensión y uso adecuado pueden proporcionar una gran flexibilidad y dinamismo a las aplicaciones. En el siguiente tema, exploraremos los atributos en C#, que a menudo se utilizan junto con la reflexión para proporcionar metadatos adicionales sobre los tipos y sus miembros.
Curso de Programación en C#
Módulo 1: Introducción a C#
- Introducción a C#
- Configuración del Entorno de Desarrollo
- Programa Hola Mundo
- Sintaxis y Estructura Básica
- Variables y Tipos de Datos
Módulo 2: Estructuras de Control
Módulo 3: Programación Orientada a Objetos
- Clases y Objetos
- Métodos
- Constructores y Destructores
- Herencia
- Polimorfismo
- Encapsulamiento
- Abstracción
Módulo 4: Conceptos Avanzados de C#
- Interfaces
- Delegados y Eventos
- Genéricos
- Colecciones
- LINQ (Consulta Integrada en el Lenguaje)
- Programación Asíncrona
Módulo 5: Trabajando con Datos
Módulo 6: Temas Avanzados
- Reflexión
- Atributos
- Programación Dinámica
- Gestión de Memoria y Recolección de Basura
- Multihilo y Programación Paralela
Módulo 7: Construcción de Aplicaciones
Módulo 8: Mejores Prácticas y Patrones de Diseño
- Estándares de Codificación y Mejores Prácticas
- Patrones de Diseño
- Pruebas Unitarias
- Revisión y Refactorización de Código