从表达式获取结果

时间:2009-12-06 18:53:17

标签: c# lambda expression-trees

我在运行时创建了一个lambda表达式,想要评估它 - 我该怎么做?我只想自己运行表达式,而不是反对任何集合或其他值。

在此阶段,一旦创建,我就可以看到它的类型为Expression<Func<bool>>,其值为{() => "MyValue".StartsWith("MyV")}

我当时觉得我可以打电话给var result = Expression.Invoke(expr, null);,我会得到我的布尔结果。但这只会返回一个InvocationExpression,它在调试器中看起来像{Invoke(() => "MyValue".StartsWith("MyV"))}

我很确定我很接近,但无法弄清楚如何得到我的结果!

感谢。

3 个答案:

答案 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
*/