En C# con .NET 3.5, se puede utilizar para este Expression
; puedes construir una expresión parametrizada y luego compilarla a un delegado. Esto es exactamente lo que hice para el aspecto matemático de Finguistics. Todavía tengo el código de análisis que usé si lo deseas ...
El truco principal que utilicé fue que para mantener el tipo de delegado conocido, utilicé una matriz como tipo de entrada - tratando diferentes argumentos como arr [0] , arr 1, arr [2] etc. Esto significa que podría compilar a (por ejemplo) un Func<decimal[], decimal>
(toma una matriz de decimal
s, devuelve un decimal
).
vez que haya llamado Compile()
, esto es pertty tanto como si tuviera código para hacerlo directamente.
(edit)
Como un breve ejemplo de la utilización de Expression
de esta manera (con una función de codificación fija), véase más adelante. El analizador ya he escrito actualmente funciona como un predicado corrector - es decir, para comprobar que "+ (2 *? -?)?? = 22 +" - pero no sería difícil cambiarlo para devolver el resultado (e introducir más operaciones, como sin
/pow
/etc - supuestamente asignándolas directamente a métodos públicos en un objeto auxiliar (a través de Expression.Call
)).
using System;
using System.Linq.Expressions;
static class Program
{
static void Main()
{
var args = Expression.Parameter(typeof(float[]), "args");
var x = Expression.ArrayIndex(args, Expression.Constant(0));
var y = Expression.ArrayIndex(args, Expression.Constant(1));
var add = Expression.Add(x, y);
var lambda = Expression.Lambda<Func<float[], float>>(add, args);
Func<float[], float> func = lambda.Compile();
Console.WriteLine(func.Call(1, 2));
Console.WriteLine(func.Call(3, 4));
Console.WriteLine(func.Call(5, 6));
}
static T Call<T>(this Func<T[], T> func, params T[] args)
{ // just allows "params" usage...
return func(args);
}
}
¿Qué tan compleja es una expresión? Limitado a cuatro funciones aritméticas, o muy general? – Richard
Puede ser bastante complejo, incluidas las funciones con múltiples parámetros. – Steve