La programación dinámica en C# permite a los desarrolladores escribir código que puede manejar tipos de datos que no se conocen hasta el tiempo de ejecución. Esto es especialmente útil en escenarios donde la flexibilidad y la adaptabilidad son cruciales, como en aplicaciones que interactúan con datos de diferentes fuentes o que necesitan ser altamente configurables.

Conceptos Clave

  1. Tipo dynamic: Permite que una variable pueda cambiar de tipo en tiempo de ejecución.
  2. ExpandoObject: Proporciona un objeto que puede tener miembros dinámicos añadidos y eliminados en tiempo de ejecución.
  3. DynamicObject: Permite crear objetos dinámicos personalizados mediante la sobrecarga de métodos.

Tipo dynamic

El tipo dynamic en C# permite que una variable pueda cambiar de tipo en tiempo de ejecución. Esto es diferente del tipo object, que requiere conversión explícita.

Ejemplo Básico

using System;

class Program
{
    static void Main()
    {
        dynamic variable = 1;
        Console.WriteLine(variable); // Salida: 1

        variable = "Hola Mundo";
        Console.WriteLine(variable); // Salida: Hola Mundo

        variable = DateTime.Now;
        Console.WriteLine(variable); // Salida: Fecha y hora actual
    }
}

Explicación

  • dynamic variable = 1;: La variable se inicializa como un entero.
  • variable = "Hola Mundo";: La variable cambia a una cadena.
  • variable = DateTime.Now;: La variable cambia a un objeto DateTime.

ExpandoObject

ExpandoObject permite crear objetos dinámicos a los que se pueden agregar y eliminar miembros en tiempo de ejecución.

Ejemplo

using System;
using System.Dynamic;

class Program
{
    static void Main()
    {
        dynamic expando = new ExpandoObject();
        expando.Nombre = "Juan";
        expando.Edad = 30;

        Console.WriteLine($"Nombre: {expando.Nombre}, Edad: {expando.Edad}");

        expando.Saludar = new Action(() => Console.WriteLine("Hola!"));
        expando.Saludar();
    }
}

Explicación

  • dynamic expando = new ExpandoObject();: Crea un objeto dinámico.
  • expando.Nombre = "Juan";: Agrega una propiedad Nombre.
  • expando.Edad = 30;: Agrega una propiedad Edad.
  • expando.Saludar = new Action(() => Console.WriteLine("Hola!"));: Agrega un método Saludar.

DynamicObject

DynamicObject permite crear objetos dinámicos personalizados mediante la sobrecarga de métodos.

Ejemplo

using System;
using System.Dynamic;

class MiObjetoDinamico : DynamicObject
{
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = $"Propiedad '{binder.Name}' no encontrada";
        return true;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        Console.WriteLine($"Asignando '{value}' a '{binder.Name}'");
        return true;
    }
}

class Program
{
    static void Main()
    {
        dynamic obj = new MiObjetoDinamico();
        obj.Nombre = "Juan";
        Console.WriteLine(obj.Nombre);
    }
}

Explicación

  • TryGetMember: Se llama cuando se intenta obtener una propiedad.
  • TrySetMember: Se llama cuando se intenta establecer una propiedad.

Ejercicio Práctico

Ejercicio

Crea un programa que utilice ExpandoObject para representar un objeto Persona con propiedades Nombre, Edad y un método Presentarse que imprima un mensaje de presentación.

Solución

using System;
using System.Dynamic;

class Program
{
    static void Main()
    {
        dynamic persona = new ExpandoObject();
        persona.Nombre = "Ana";
        persona.Edad = 25;
        persona.Presentarse = new Action(() => Console.WriteLine($"Hola, soy {persona.Nombre} y tengo {persona.Edad} años."));

        persona.Presentarse();
    }
}

Explicación

  • dynamic persona = new ExpandoObject();: Crea un objeto dinámico persona.
  • persona.Nombre = "Ana";: Agrega la propiedad Nombre.
  • persona.Edad = 25;: Agrega la propiedad Edad.
  • persona.Presentarse = new Action(() => Console.WriteLine($"Hola, soy {persona.Nombre} y tengo {persona.Edad} años."));: Agrega el método Presentarse.

Conclusión

La programación dinámica en C# proporciona una gran flexibilidad al permitir que los tipos de datos se determinen en tiempo de ejecución. Esto es útil en situaciones donde la estructura de los datos no es conocida de antemano o puede cambiar. Los tipos dynamic, ExpandoObject y DynamicObject son herramientas poderosas que permiten a los desarrolladores escribir código más adaptable y flexible.

En el siguiente tema, exploraremos la Gestión de Memoria y Recolección de Basura, donde aprenderemos cómo C# maneja la memoria y cómo podemos optimizar el uso de recursos en nuestras aplicaciones.

© Copyright 2024. Todos los derechos reservados