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

  1. Namespace System.Reflection: La mayoría de las clases y métodos relacionados con la reflexión se encuentran en este namespace.
  2. Tipos de Datos: La reflexión permite trabajar con tipos de datos en tiempo de ejecución.
  3. Métodos y Propiedades: Puedes obtener información sobre métodos y propiedades de un tipo.
  4. Instanciación Dinámica: Crear instancias de tipos en tiempo de ejecución.
  5. 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

  1. Namespace System.Reflection: Importamos el namespace necesario para trabajar con reflexión.
  2. Clase Persona: Definimos una clase simple con propiedades y un método.
  3. Obtener Tipo: Usamos typeof(Persona) para obtener el tipo de la clase Persona.
  4. Propiedades: Iteramos sobre las propiedades del tipo usando GetProperties().
  5. 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.

© Copyright 2024. Todos los derechos reservados