【问题标题】:How to enable LINQ for embedded IronPython scripts如何为嵌入式 IronPython 脚本启用 LINQ
【发布时间】:2012-08-07 22:09:33
【问题描述】:

我的应用程序可以通过用户提供的 IronPython 脚本进行扩展。

  • 首先,我创建一个新的ScriptScope
  • 使用该脚本范围,我运行了一个简短的设置脚本来执行一些方便的导入。
  • 最后,我在准备好的范围内运行所有用户脚本。

设置脚本如下所示:

import clr
import System
from System import Exception
from System import Math
clr.ImportExtensions(System.Linq.Enumerable)

这个想法是用户脚本可以使用常见的类型,如MathException,而无需先导入它们。

我还希望 LINQ 开箱即用,因此我将最后一行添加到设置脚本中。但是,虽然常规导入工作正常,但扩展导入却不行。据我所知,常规导入成为脚本范围的一部分,因此可用于在同一范围内运行的任何后续脚本。然而,扩展导入的工作方式似乎有所不同。

所以我的问题是:我执行的脚本如何使用 LINQ 而无需显式导入扩展方法?

注意:有很多脚本,其中许多只包含一个表达式。所以我宁愿避免使用扩展导入自动为每个脚本添加前缀的性能损失。

【问题讨论】:

  • 你看过mail.python.org/pipermail/ironpython-users/2011-May/014829.html 吗?这可以解释您所面临的行为吗?
  • @Simon:感谢您提供的链接,这肯定解释了这种行为。现在,如果他们实现了上一篇文章中的建议:“一个 clr.ImbueTypeWithExtensions(cls, extcls) 方法......使扩展在任何地方都可用。”
  • 我不相信有办法按照您的要求进行操作。您能否创建一个问题 (ironpython.codeplex.com/WorkItem/Create) 描述您希望看到的内容?

标签: extension-methods ironpython


【解决方案1】:

在 IL 中查看 Reflector 或 ILSpy 中的 LINQ 语句。 LINQ 是编译器的魔法,它把语句变成一堆类和方法调用。你永远不会让 LINQ 工作。您最好的选择是为您执行一些与 LINQ 相关的工作的包装类。专注于您尝试提供的实际用例,并提供 Helper 方法来完成工作。

【讨论】:

  • 这不正确。一旦您执行clr.ImportExtensions(System.Linq.Enumerable),LINQ 在 IronPython 中就可以很好地工作。我的问题是是否有办法设置脚本系统,以便脚本不必包含该行。
  • 我猜我们在 LINQ 是什么方面存在分歧。我认为 i 是来自 x in enumerable where x.Prop
  • 这是有道理的。当我说 LINQ 时,我指的是扩展方法语法。我的错,我应该更精确!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 2010-12-12
相关资源
最近更新 更多