2012-04-10 45 views
2

Expression<T>是做什么用的?什么是表达<T>呢?

我已经看到了类似的方法使用:

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

你就不能返回Func<MyClass,bool>

由于<和>的迹象,Google和SO搜索都失败了。

+0

搜索“表达树”与“匿名代表”。 – Oded 2012-04-10 19:16:41

+0

所以表达式被称为表达树? – Khan 2012-04-10 19:21:39

+1

它用于构建表达式树。 – Oded 2012-04-10 19:21:54

回答

4

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

举例来说,如果你有

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

然后x => x.Name == "Alan Turning"可以编程,如果它表示为一个表达式树检查,但没有这么多,如果它认为是一个代表。这对于LINQ提供者来说特别有用,它将遍历表达式树来将lambda表达式转换为不同的表示形式。例如,LINQ到SQL将上述表达式树转换成

SELECT * FROM COMPUTERSCIENTIST WHERE NAME = 'Alan Turing' 

它可以这样做,因为lambda表达式的表示为树,其节点可以被走过和检查这一点。

3

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

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

MSDN - Expression(TDelegate)

+0

谢谢,MSDN参考中的这一行帮助:* lambda表达式的内存数据表示* – Khan 2012-04-10 19:27:47

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只有很少的信息可用。用Expressions再次尝试一下,你会看到很多信息,包括方法体和参数在运行时可见。这是表达式树的真正力量。