我在运行时创建了一个lambda表达式,想要评估它 - 我该怎么做?我只想自己运行表达式,而不是反对任何集合或其他值。
在此阶段,一旦创建,我就可以看到它的类型为Expression<Func<bool>>
,其值为{() => "MyValue".StartsWith("MyV")}
。
我当时觉得我可以打电话给var result = Expression.Invoke(expr, null);
,我会得到我的布尔结果。但这只会返回一个InvocationExpression
,它在调试器中看起来像{Invoke(() => "MyValue".StartsWith("MyV"))}
。
我很确定我很接近,但无法弄清楚如何得到我的结果!
感谢。
答案 0 :(得分:15)
尝试使用Compile
方法编译表达式,然后调用返回的委托:
using System;
using System.Linq.Expressions;
class Example
{
static void Main()
{
Expression<Func<Boolean>> expression
= () => "MyValue".StartsWith("MyV");
Func<Boolean> func = expression.Compile();
Boolean result = func();
}
}
答案 1 :(得分:2)
正如Andrew所说,你必须先编译一个Expression才能执行它。另一种选择是根本不使用表达式,这看起来像这样:
Func<Boolean> MyLambda = () => "MyValue".StartsWith("MyV");
var Result = MyLambda();
在此示例中,lambda表达式在构建项目时编译,而不是转换为表达式树。如果您没有动态操作表达式树或使用使用表达式树的库(Linq到Sql,Linq to Entities等),那么以这种方式执行它会更有意义。
答案 2 :(得分:1)
我这样做的方式就是从这里开始:MSDN example
delegate int del(int i);
static void Main(string[] args)
{
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25
}
此外,如果您想使用Expression<TDelegate>
类型,则此页面显示:Expression(TDelegate) Class (System.Linq.Expression)具有以下示例:
// Lambda expression as executable code.
Func<int, bool> deleg = i => i < 5;
// Invoke the delegate and display the output.
Console.WriteLine("deleg(4) = {0}", deleg(4));
// Lambda expression as data in the form of an expression tree.
System.Linq.Expressions.Expression<Func<int, bool>> expr = i => i < 5;
// Compile the expression tree into executable code.
Func<int, bool> deleg2 = expr.Compile();
// Invoke the method and print the output.
Console.WriteLine("deleg2(4) = {0}", deleg2(4));
/* This code produces the following output:
deleg(4) = True
deleg2(4) = True
*/