Expression<T>
做什么?
我已经看到它用于类似的方法:
private Expression<Func<MyClass,bool>> GetFilter(...)
{
}
你不能只返回Func<MyClass,bool>
吗?
答案 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)
答案 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提供的信息非常少。使用表达式再次尝试它,您将看到许多信息,包括方法体和参数在运行时可见。这是表达树的真正力量。