csharp-dynamics

Cómo usar Dynamics en C#

El tipo dynamic es una funcionalidad introducida en C# 4.0 que permite la programación dinámica. Nos permite resolver tipos y miembros en tiempo de ejecución en lugar de en tiempo de compilación

Es decir, el tipo dynamic es omite la verificación estática de tipos en tiempo de compilación y delega la resolución de tipos y miembros a tiempo de ejecución.

Esto significa que las operaciones sobre variables de tipo dynamic no se validan hasta que el programa se está ejecutando. Esto nos permite permite un gran flexibilidad en ciertos escenarios de programación.

Sin embargo, también tiene muchos detractores. Significa saltarse un poco las pautas del tipado fuerte, lo cuál a muchos desarrolladores no les gusta (de hecho, no tuvo especialmente éxito, y esta un poco en desuso)

Sintaxis básica

El tipo dynamic se declara de manera similar a otros tipos en C#, utilizando la palabra clave dynamic como tipo.

dynamic variable = 10;
variable = "Hello, World!";
variable = new List<int> { 1, 2, 3 };

En este ejemplo, variable puede contener diferentes tipos de valores, y el tipo real de variable se resuelve en tiempo de ejecución.

Operaciones con dynamic

Cuando se realizan operaciones con una variable de tipo dynamic, el compilador no realiza ninguna verificación de tipo. En su lugar, las operaciones se resuelven en tiempo de ejecución.

dynamic valor = 10;
Console.WriteLine(valor + 5); // Operación válida, salida: 15

valor = "Hello";
Console.WriteLine(valor + " World!"); // Operación válida, salida: Hello World!

En el primer caso, valor es tratado como un entero, mientras que en el segundo caso, es tratado como una cadena.

Manejo de excepciones

Dado que las operaciones dynamic se resuelven en tiempo de ejecución, es especialmente importante estar atento a las excepciones que pueden ocurrir por errores de tipo.

try
{
    dynamic valor = "texto";
    int numero = valor; // Provocará una excepción en tiempo de ejecución
}
catch (RuntimeBinderException ex)
{
    Console.WriteLine($"Error: {ex.Message}");
}

Ventajas y desventajas del uso de dynamic

Desventajas

  • Rendimiento: Las operaciones dynamic pueden ser más lentas debido a la necesidad de resolver tipos en tiempo de ejecución.
  • Pérdida de seguridad de tipos: El uso de dynamic omite las comprobaciones de tipo en tiempo de compilación, lo que puede llevar a errores en tiempo de ejecución que serían evitables con tipos estáticamente definidos.
  • Menor claridad: El código con dynamic puede ser más difícil de entender y mantener debido a la falta de información de tipos en tiempo de compilación.

Ejemplos prácticos

Interacción con tipos COM

El uso de dynamic es especialmente útil al trabajar con bibliotecas COM donde los tipos no se conocen en tiempo de compilación:

dynamic excel = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
excel.Visible = true;
excel.Workbooks.Add();
excel.Cells[1, 1].Value = "Hola Mundo";

Conversión implícita y explícita

Las variables dynamic se pueden convertir implícita o explícitamente a otros tipos:

dynamic valor = "123";
int numero = int.Parse(valor); // Conversión explícita

valor = 456;
int otroNumero = valor; // Conversión implícita

Ejemplo práctico: procesamiento de datos JSON

Un caso práctico común para dynamic es el procesamiento de datos JSON:

using System;
using System.Dynamic;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;

class Program
{
    static async Task Main(string[] args)
    {
        string url = "https://api.example.com/data";
        using HttpClient client = new HttpClient();
        string jsonData = await client.GetStringAsync(url);
        
        dynamic data = JsonConvert.DeserializeObject<ExpandoObject>(jsonData);
        Console.WriteLine(data.Nombre);
        Console.WriteLine(data.Edad);
    }
}

En este ejemplo, se utiliza dynamic para deserializar datos JSON en un objeto dinámico, permitiendo el acceso directo a las propiedades sin necesidad de definir previamente una clase de datos.