miércoles, 7 de abril de 2010

Metaprogramación en c#

Aunque c# no proporcione demasiadas ayudas sintácticas a la metaprogramación si que se pueden aprovechar sus estructuras y tipos de datos para generar métodos de fórma dinámica.

En el siguiente código hay un ejemplo.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Collections;
using System.Runtime.InteropServices;


namespace example1{
class Program{
[DllImport("msvcrt.dll")]
static extern bool system(string str);

static void Main(string[] args){
Dictionary<string, Action<string>> method = new Dictionary<string, Action<string>>();
Expression<Action<string>> exp;

for (int i = 0; i < 100; i++)
{
var number = i;
exp = (p => Console.WriteLine("Parametro: " +p+"\nMetodo numero: "+number));
method["print_" + i] = exp.Compile();

exp = (p => Console.WriteLine(p + number));
method["concat_" + i] = exp.Compile();
}

method["print_17"]("test");
method["concat_35"]("Concatenando el numero -> ");


system("pause");
}
}
}

En primer lugar se crea un diccionario llamado method para contener todas las funciones generadas automáticamente.

Luego, en el bucle se crean 200 métodos, tanto dependientes de parámetro como de su posición en el bucle, sin embargo, para esto es necesario un pequeño hack.
Se le asigna a number el valor del contador, creando un objeto en cada iteración, en caso contrario todos los métodos creados tendrán como valor de i el último que ha tomado en el bucle, es decir, 100.

0 comentarios: