Introducido en .NET 4.0, ExpandoObject es un tipo especial diseñado para usarse con objetos dinámico. Los ExpandoObject nos permite agregar propiedades, métodos y eventos a objetos en tiempo de ejecución.
Para ello, ExpandoObject implementa la interfaz IDynamicMetaObjectProvider, que básicamente es un diccionario, lo que le permite ser dinámicamente extendido en tiempo de ejecución. Esto significa que puedes agregar propiedades, métodos y eventos a un ExpandoObject después de que el objeto ha sido creado.
En esencia, ExpandoObject permite una flexibilidad similar a la de los objetos en lenguajes dinámicos como JavaScript, pero en un entorno fuertemente tipado como C#.
Creación de un ExpandoObject
Para trabajar con ExpandoObject, primero tenemos que importar el espacio de nombres System.Dynamic. A continuación, puedes crear una instancia de ExpandoObject y agregarle propiedades y métodos dinámicamente.
// Crear una instancia de ExpandoObject
dynamic persona = new ExpandoObject();
// Agregar propiedades
persona.Nombre = "Luis";
persona.Edad = 30;
// Agregar un método
persona.Saludar = new Action(() => Console.WriteLine($"Hola, mi nombre es {persona.Nombre} y tengo {persona.Edad} años."));
// Usar las propiedades y el método
Console.WriteLine($"Nombre: {persona.Nombre}");
Console.WriteLine($"Edad: {persona.Edad}");
persona.Saludar();
En este ejemplo:
- Instancia de
ExpandoObject: Se crea un nuevo objeto dinámicopersona. - Propiedades: Se agregan propiedades
NombreyEdadal objeto. Debido a la naturaleza dinámica deExpandoObject, puedes asignarles valores directamente. - Método: Se añade un método
Saludaral objeto. En este caso, el método se define como una instancia deActionque imprime un saludo personalizado. - Uso: Se accede a las propiedades y se llama al método como si fueran miembros normales de un objeto.
Agregar y modificar propiedades y métodos dinámicamente
La gracia de ExpandoObject radica en su capacidad para modificar su estructura en tiempo de ejecución. Por ejemplo,
// Crear una instancia de ExpandoObject
dynamic producto = new ExpandoObject();
// Agregar propiedades
producto.Nombre = "Laptop";
producto.Precio = 1200;
// Agregar un método
producto.Descripcion = new Func<string>(() => $"El producto es una {producto.Nombre} con un precio de ${producto.Precio}.");
// Mostrar información
Console.WriteLine(producto.Descripcion());
// Modificar propiedades
producto.Precio = 1100;
Console.WriteLine(producto.Descripcion());
En el ejemplo,
- Propiedades y método Iniciales: Se definen inicialmente las propiedades
NombreyPrecio, y se agrega un métodoDescripcionque utiliza estas propiedades para generar una cadena descriptiva. - Modificación de propiedades: Después de mostrar la descripción inicial, se actualiza el valor de la propiedad
Precioy se muestra la nueva descripción.
Uso avanzado
ExpandoObject también se puede utilizar en combinación con colecciones y otros tipos dinámicos para crear estructuras más complejas.
// Crear una lista de ExpandoObjects
var productos = new List<ExpandoObject>();
// Agregar productos a la lista
dynamic producto1 = new ExpandoObject();
producto1.Nombre = "Tablet";
producto1.Precio = 300;
productos.Add(producto1);
dynamic producto2 = new ExpandoObject();
producto2.Nombre = "Smartphone";
producto2.Precio = 500;
productos.Add(producto2);
// Mostrar información de los productos
foreach (dynamic producto in productos)
{
Console.WriteLine($"{producto.Nombre}: ${producto.Precio}");
}
En este ejemplo,
- Lista de
ExpandoObject: Se crea una lista que contiene variosExpandoObject, cada uno representando un producto. - Agregar productos: Se añaden productos a la lista con propiedades
NombreyPrecio. - Mostrar productos: Se recorre la lista y se accede a las propiedades de cada producto para mostrarlas en la consola.