2012-08-10 88 views
1

我的應用程序可以通過用戶提供的IronPython腳本進行擴展。如何爲嵌入式IronPython腳本啓用LINQ

  • 首先,我創建了一個新的ScriptScope
  • 使用該腳本範圍,我運行一個簡短的安裝腳本,執行一些便利的導入。
  • 最後,我在準備的範圍內運行所有用戶腳本。

安裝腳本是這樣的:

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

的想法是,用戶腳本可以使用常見的類型,如MathException,而無需首先導入。

我還希望LINQ能夠開箱即用,所以我將最後一行添加到了安裝腳本中。但是,雖然正常導入工作正常,但擴展導入不適用。從我可以看出,常規導入成爲腳本範圍的一部分,因此可用於在相同範圍內運行的任何後續腳本。但是,擴展輸入似乎工作方式不同。

所以我的問題是:我怎麼能執行一個腳本使用LINQ而不必顯式導入擴展方法?

注意:有很多腳本,其中很多腳本只包含一個表達式。所以我寧願避免使用擴展名導入來自動爲每個腳本添加前綴的性能損失。

+0

你看過http://mail.python.org/pipermail/ironpython-users/2011-May/014829.html嗎?這能解釋你所面對的行爲嗎? – 2012-08-19 18:11:06

+0

@Simon:感謝您的鏈接,這當然解釋了這種行爲。現在,只要他們實現了最後一篇文章中提出的建議:「一個clr.ImbueTypeWithExtensions(cls,extcls) 方法...使擴展在任何地方都可用。」 – 2012-08-23 05:39:45

+0

我不相信有一種方法可以做你想問的問題。你能否創建一個描述你想看到的問題(http://ironpython.codeplex.com/WorkItem/Create)? – 2012-09-06 14:45:20

回答

0

查看IL中反射器或ILSpy中的LINQ語句。 LINQ在工作中是編譯器的魔力,將語句轉換成一堆類和方法調用。你永遠不會讓LINQ工作。你最好的選擇是爲你做一些LINQ相關工作的包裝類。關注您正在嘗試提供的實際用例,並提供Helper方法來完成工作。

+0

這是不正確的。一旦你做了'clr.ImportExtensions(System.Linq.Enumerable)',LINQ就可以在IronPython中奇妙地工作。我的問題是,是否有辦法設置腳本系統,以便腳本不必包含該行。 – 2015-03-27 20:02:49

+0

我想我們在LINQ是什麼不同。我認爲我是enumerable中的x,其中x.Prop <0選擇x元語言。 – cbuteau 2015-03-29 14:39:16

+0

這是有道理的。當我說LINQ時,我在談論擴展方法的語法。我的壞,我應該更加精確! – 2015-03-29 19:38:23