我正在尝试使用.Net 3.5中的表达式树和Lamdba Expression对象来允许我动态计算用户输入的布尔表达式。
到目前为止,用户可以创建一个由BinarayExpressions
组成的表达式树,其中AND和OR值表示为ParameterExpressions
。然后我计划基于该树创建一个LambdaExpression
,以便我可以将表达式编译成一个委托,然后我可以调用它。我遇到的问题是我不知道用户需要多少输入参数,所以当我将表达式编译成委托时,我不知道方法签名在运行之前应该是什么方法。
到目前为止,我已经提出了两种可能的解决方案。
Func<bool, bool, bool...>
那些可以
采用我认为用户可能需要的参数。这不是最优雅的解决方案,但我认为它会起作用,直到有人想要使用比我提供的更多参数。注意:它需要快速,所以没有拳击或类似的东西。
答案 0 :(得分:3)
之前我使用数组方法Expression.ArrayIndex
:
var arr = Expression.Parameter(typeof(int[]), "arr");
var body = Expression.ArrayIndex(arr, Expression.Constant(1));
var expr = Expression.Lambda<Func<int[], int>>(body, arr);
var func = expr.Compile();
int[] vals = { 7, 8, 9 };
int i = func(vals);
阵列方法的优点是,无论参数的数量如何,您都可以保留强类型的委托类型(Func<int[],int>
或类似的类型。并且键入的Invoke
比{{1}快得多}。
如果值不是全部相同的类型 - 那也是可行的;让我知道,我将添加一个例子。