C#.NET 3.5:什么是表达式<>用于?

时间:2009-09-15 05:27:40

标签: c# expression

Expression<>究竟是什么?用于C#?是否存在将Expression<>自己实例化为对象的情况?如果是这样,请举个例子!

谢谢!

3 个答案:

答案 0 :(得分:8)

Expression<T>几乎完全用于LINQ,但没有。在LINQ中,它通常用于“捕获”代码中表达的逻辑,但将其保存在数据中。然后,LINQ提供商可以检查该数据并进行适当处理 - 例如通过将其转换为SQL。通常LINQ中的表达式树是由编译器从lambda表达式或查询表达式创建的 - 但在其他情况下,直接使用API​​本身就很方便。

我使用过的其他地方的一些例子,并看到它使用过:

  • MiscUtil中,Marc Gravell使用它来实现“通用算术” - 如果类型具有相关运算符,则可以一般使用它。
  • UnconstrainedMelody中,我以类似的方式使用它来对标记枚举执行操作,而不管它们的基础类型(由于longulong,它比您预期的要复杂一些有不同的范围)
  • Visual LINQ中,我使用查询表达式来“动画化”LINQ,因此您可以看到正在发生的事情。虽然这显然是LINQ用法,但它并不是将逻辑转换为另一种形式的传统形式。

答案 1 :(得分:4)

就LINQ而言,你可以做些事情来在运行时创建比纯粹在lambdas中更多样化的LINQ查询。

我多次使用Expression作为微编译器,作为DynamicMethod和IL的替代品。这种方法在.NET 4.0(as discussed on InfoQ)中变得更强,但即使在3.5中也有很多你可以做的事情(通常基于运行时数据;配置等):

我还将它作为数学引擎的一部分用于我对Microsoft所做的一些工作 - 即将数学表达式(“(x + 12)* y = z”等)解析为Expression树,编译它并运行它。

另一个有用的用法(由Jason Bock说明,here)是遗传编程;将您的候选人建立为Expression树,并且您拥有必要的代码来快速执行它们(Compile()之后),但重要的是(对于遗传编程),也可以交换片段。

答案 2 :(得分:0)

看看我之前和之后在my answer to another SO question中的代码之后。

总结:Expression<>大大简化了代码,使其更易于理解,甚至修复了幻像错误。