10

C# 中的 Expression<> 到底是做什么用的?是否有任何场景可以将 Expression<> 自己实例化为对象?如果有,请举个例子!

谢谢!

4

3 回答 3

8

Expression<T>几乎完全用于 LINQ,但并非必须如此。在 LINQ 中,它通常用于“捕获”以代码表示的逻辑,但将其保存在数据中。然后,该数据可以由 LINQ 提供程序检查并进行适当处理——例如,通过将其转换为 SQL。通常 LINQ 中的表达式树是由编译器根据 lambda 表达式或查询表达式创建的 - 但在其他情况下,您自己直接使用 API 会很方便。

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

  • MiscUtil中,Marc Gravell 用它来实现“泛型算术”——如果一个类型有相关的操作符,它就可以被泛型使用。
  • UnconstrainedMelody中,我以类似的方式使用它来对标志枚举执行操作,而不管它们的基础类型如何(这比您预期的要棘手,因为long范围ulong不同)
  • Visual LINQ中,我使用查询表达式来“动画化”LINQ,因此您可以看到发生了什么。虽然显然这是一种 LINQ 用法,但它并不是将逻辑转换为另一种形式的传统形式。
于 2009-09-15T06:09:04.467 回答
4

就 LINQ 而言,您可以做一些事情来在运行时创建比纯粹在 lambda 中更通用的 LINQ 查询。

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

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

Another intersting use (illustrated by Jason Bock, here) is in genetic programming; build your candidates as Expression trees, and you have the necessary code to execute them quickly (after Compile()), but importantly (for genetic programming), also to swap fragments around.

于 2009-09-15T06:40:02.110 回答
0

在我对另一个 SO 问题的回答中查看我的前后代码。

总结:Expression<>大大简化了代码,更容易理解,甚至修复了一个幻影错误。

于 2009-09-15T05:32:27.333 回答