Introducido en .NET 4.0, ExpandoObject
es un tipo especial que corresponde con un objeto dinámico. Es decir, permite agregar propiedades, métodos y eventos a objetos en tiempo de ejecución.
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#.
Para ello, ExpandoObject
implementa la interfaz IDynamicMetaObjectProvider
, que básicamente es un diccionario 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.
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 = "Juan";
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
Nombre
yEdad
al objeto. Debido a la naturaleza dinámica deExpandoObject
, puedes asignarles valores directamente. - Método: Se añade un método
Saludar
al objeto. En este caso, el método se define como una instancia deAction
que 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 este código,
- Propiedades y Método Iniciales: Se definen inicialmente las propiedades
Nombre
yPrecio
, y se agrega un métodoDescripcion
que 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
Precio
y 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
Nombre
yPrecio
. - Mostrar Productos: Se recorre la lista y se accede a las propiedades de cada producto para mostrarlas en la consola.