Expression<T>
是做什么用的?什么是表达<T>呢?
我已经看到了类似的方法使用:
private Expression<Func<MyClass,bool>> GetFilter(...)
{
}
你就不能返回Func<MyClass,bool>
?
由于<和>的迹象,Google和SO搜索都失败了。
Expression<T>
是做什么用的?什么是表达<T>呢?
我已经看到了类似的方法使用:
private Expression<Func<MyClass,bool>> GetFilter(...)
{
}
你就不能返回Func<MyClass,bool>
?
由于<和>的迹象,Google和SO搜索都失败了。
如果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表达式的表示为树,其节点可以被走过和检查这一点。
谢谢,MSDN参考中的这一行帮助:* lambda表达式的内存数据表示* – Khan 2012-04-10 19:27:47
是的,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再次尝试一下,你会看到很多信息,包括方法体和参数在运行时可见。这是表达式树的真正力量。
搜索“表达树”与“匿名代表”。 – Oded 2012-04-10 19:16:41
所以表达式被称为表达树? –
Khan
2012-04-10 19:21:39
它用于构建表达式树。 – Oded 2012-04-10 19:21:54