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
- Tipo
dynamic
: Permite que una variable pueda cambiar de tipo en tiempo de ejecución. - ExpandoObject: Proporciona un objeto que puede tener miembros dinámicos añadidos y eliminados en tiempo de ejecución.
- 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.
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