【问题标题】:C# .NET 3.5: What is Expression<> used for?C# .NET 3.5:Expression<> 的用途是什么?
【发布时间】:2010-11-28 08:35:31
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: c# expression


    【解决方案1】:

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

    我用过和看到过的其他地方的一些例子:

    • MiscUtil 中,Marc Gravell 用它来实现“泛型算术”——如果一个类型有相关的运算符,它就可以泛型使用。
    • UnconstrainedMelody 中,我以类似的方式使用它对标志枚举执行操作,而不管它们的底层类型如何(这比您想象的要复杂,因为longulong 具有不同的范围)李>
    • Visual LINQ 中,我使用查询表达式来“激活”LINQ,因此您可以看到发生了什么。虽然这显然是一种 LINQ 用法,但它并不是将逻辑转换为另一种形式的传统形式。

    【讨论】:

    • 在哪里可以看到“VisualLINQ”?
    【解决方案2】:

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

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

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

    另一个有趣的用途(由 Jason Bock 说明,here)是基因编程;将候选者构建为 Expression 树,并且您拥有快速执行它们的必要代码(在 Compile() 之后),但重要的是(对于基因编程),还可以交换片段。

    【讨论】:

    • 是否有任何地方可以看到您为 Microsoft 编写的代码?我真的很想看看这种事情的一些例子..
    • 我有一份副本,但我认为“按原样”发布它是不明智的(它由我的雇主和 Microsoft 共同拥有)。我会尽量找时间从一开始就重新做——时间不多,我在去微软阅读总部的火车上写了原版;-p
    【解决方案3】:

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

    总结:Expression&lt;&gt; 大大简化了代码,更容易理解,甚至修复了一个幻影。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多