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

谢谢你!

有帮助吗?

解决方案

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

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

  • 杂项工具, ,Marc Gravell 用它来实现“通用算术”——如果一个类型有相关的运算符,那么它就可以被通用地使用。
  • 天马行空的旋律 我以类似的方式使用它对标志枚举执行操作,无论其底层类型如何(这比您想象的更棘手,因为 longulong 具有不同的范围)
  • 可视化LINQ 我使用查询表达式来“动画”LINQ,这样您就可以看到发生了什么。虽然显然这是 LINQ 用法,但它不是将逻辑转换为另一种形式的传统形式。

其他提示

就 LINQ 而言,您可以采取一些措施来在运行时创建比纯粹使用 lambda 更通用的 LINQ 查询。

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

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

另一个有趣的用途(由 Jason Bock 插图, 这里) 从事遗传编程;将你的候选人建立为 Expression 树,并且您有必要的代码来快速执行它们(之后 Compile()),但重要的是(对于遗传编程),还可以交换片段。

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

摘要: Expression&lt;&gt; 大大简化了代码,使其更易于理解,甚至修复了幻像错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top