Tenía una parte del código que toma expresiones lambda en tiempo de ejecución, que luego puedo compilar e invocar.Reemplazar parámetros en una expresión lambda
Something thing;
Expression<Action<Something>> expression = (c => c.DoWork());
Delegate del = expression.Compile();
del.DynamicInvoke(thing);
Con el fin de ahorrar tiempo de ejecución, guardé los delegados compilados en una memoria caché, una Dictionary<String, Delegate>
el que la clave es la cadena de expresión lambda.
cache.Add("(Something)c => c.DoWork()", del);
Para exactamente las mismas llamadas, funcionó bien. Sin embargo, me di cuenta de que podía recibir lambdas equivalentes, como "d => d.DoWork()", que en realidad debería usar el mismo delegado, y no lo era.
Esto me hizo preguntarme si había una manera limpia (leer "no usar String.Replace", ya lo hice como una solución temporal) para reemplazar los elementos en una expresión lambda, como quizás reemplazarlos por arg0
para que tanto
(c => c.DoWork())
y (d => d.DoWork())
se transforman y se comparó como (arg0 => arg0.DoWork())
mediante el uso de algo fuctionnally similar a la inyección de un Expression.Parameter (Tipo, Nombre) en una lambda.
¿Es esto posible? (Las respuestas pueden incluir C# 4.0)
¿La clave siempre tendrá el formato: (tipo) arg => arg.Method() o se esperan formatos más complejos? – Elisha
Bueno, las lambdas recibidas podrían tener más params, como '(f, g) => f.Método (g)', y tendré los tipos de f y g. La clave es bastante mundana en realidad y no está escrita en piedra, cualquier forma adecuada para representar la equivalencia entre 2 lambdas junto a '((T) arg0, (V) arg1) => arg0.Método (arg1)' podría hacer el truco como la clave. –