表达式树在哪些情况下有用?

时间:2020-03-05 18:43:13  来源:igfitidea点击:

我完全理解表达式树的概念,但是我很难找到它们有用的情况。是否存在可以应用表达式树的特定实例?还是仅作为代码的传输机制有用?我觉得我在这里缺少什么。谢谢!

解决方案

回答

一些单元测试模拟框架利用表达式树来设置强类型的期望/验证。 IE:

myMock.Verify(m => m.SomeMethod(someObject)); // tells moq to verify that the method
                                              // SomeMethod was called with 
                                              // someObject as the argument

这里,表达式从不实际执行,但是表达式本身包含有趣的信息。没有表达式树的替代方案是

myMock.Verify("SomeMethod", someObject) // we've lost the strong typing

回答

Or is it only useful as a transport mechanism for code?

作为代码的执行机制很有用。使用解释器模式,可以直接解释表达式树。这非常有用,因为它非常容易实现。这样的解释器无处不在,甚至在似乎无法解释任何东西的情况下也可以使用,例如用于打印嵌套结构。

回答

当我们需要访问函数逻辑以某种方式更改或者重新应用它时,表达式树很有用。

Linq to SQL是一个很好的例子:

//a linq to sql statement
var recs (
    from rec in LinqDataContext.Table
    where rec.IntField > 5
    select rec );

如果我们没有表达式树,则此语句将必须返回所有记录,然后将Cwhere逻辑应用于每个记录。

使用表达式树,rec.IntField> 5可以解析为SQL:

--SQL statment executed
select *
from [table]
where [table].[IntField] > 5