C# 中的 Expression<> 到底是做什么用的?是否有任何场景可以将 Expression<> 自己实例化为对象?如果有,请举个例子!
谢谢!
Expression<T>
几乎完全用于 LINQ,但并非必须如此。在 LINQ 中,它通常用于“捕获”以代码表示的逻辑,但将其保存在数据中。然后,该数据可以由 LINQ 提供程序检查并进行适当处理——例如,通过将其转换为 SQL。通常 LINQ 中的表达式树是由编译器根据 lambda 表达式或查询表达式创建的 - 但在其他情况下,您自己直接使用 API 会很方便。
我使用过并看到使用过的其他地方的一些示例:
long
范围ulong
不同)就 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.
在我对另一个 SO 问题的回答中查看我的前后代码。
总结:Expression<>
大大简化了代码,更容易理解,甚至修复了一个幻影错误。