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
