表达式<t>做什么?</t>

时间:2012-04-10 19:13:37

标签: linq c#-4.0

Expression<T>做什么?

我已经看到它用于类似的方法:

private Expression<Func<MyClass,bool>> GetFilter(...)
{
}

你不能只返回Func<MyClass,bool>吗?

由于&lt; Google和SO搜索失败了我和&gt;迹象。

3 个答案:

答案 0 :(得分:4)

如果TDelegate表示委托类型,则Expression<TDelegate>表示一个lambda表达式,可以将其转换为类型为TDelegate的委托作为表达式树。这允许您以编程方式检查lambda表达式以提取有用信息。

例如,如果你有

var query = source.Where(x => x.Name == "Alan Turing");

然后可以以编程方式检查x => x.Name == "Alan Turning",如果它表示为表达式树,但如果它被认为是委托,则不是那么多。这在LINQ提供程序的情况下特别有用,它将遍历表达式树以将lambda表达式转换为不同的表示形式。例如,LINQ to SQL会将上面的表达式树转换为

 SELECT * FROM COMPUTERSCIENTIST WHERE NAME = 'Alan Turing'

它可以做到这一点,因为lambda表达式表示为树,其节点可以走路和检查。

答案 1 :(得分:3)

Expression允许您检查委托内部代码的结构,而不仅仅是存储委托本身。

像往常一样,MSDN对此很清楚:

MSDN - Expression(TDelegate)

答案 2 :(得分:0)

是的,可以使用Func<>代替表达式的位置。表达式树的实用程序是它为远程LINQ提供程序(如LINQ to SQL)提供了向前看并查看允许查询运行所需的语句的能力。换句话说,将代码作为数据进行处理。

        //run the debugger and float over multBy2.  It will be able to tell you that it is an method, but it can't tell you what the implementation is.
        Func<int, int> multBy2 = x => 2 * x;
        //float over this and it will tell you what the implmentation is, the parameters, the method body and other data
        System.Linq.Expressions.Expression<Func<int, int>> expression = x => 2 * x;

在上面的代码中,您可以通过调试器比较可用的数据。我邀请你这样做。您将看到Func提供的信息非常少。使用表达式再次尝试它,您将看到许多信息,包括方法体和参数在运行时可见。这是表达树的真正力量。