csharp-tipo-expando

Cómo usar expandos en C#

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á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 el ejemplo,

  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.