csharp-tipo-expando

El tipo `ExpandoObject` en C#

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ámico persona.
  • Propiedades: Se agregan propiedades Nombre y Edad al objeto. Debido a la naturaleza dinámica de ExpandoObject, 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 de Action 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,

  1. Propiedades y Método Iniciales: Se definen inicialmente las propiedades Nombre y Precio, y se agrega un método Descripcion que utiliza estas propiedades para generar una cadena descriptiva.
  2. 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 varios ExpandoObject, cada uno representando un producto.
  • Agregar Productos: Se añaden productos a la lista con propiedades Nombre y Precio.
  • Mostrar Productos: Se recorre la lista y se accede a las propiedades de cada producto para mostrarlas en la consola.