2010-01-07 85 views
3

執行PythonFunction這裏的情況。我希望能夠爲Python拉姆達傳遞到C#方法,其中拉姆達的評價應該發生。當我傳入lambda時,它變成了一個PythonFunction的實例。我被困在這裏,因爲我不知道如何執行這個PythonFunction。我在這個類上看到一個「調用」,但我不知道在哪裏獲取它所需的CodeContext。(IronPython的)從C#

任何人都知道如何做到這一點?

回答

4

如果你不想(或不能)使用一個委託,該ObjectOperations類是一個更好的選擇。距離engine.ObjectOperations訪問(其中engine是你ScriptEngine實例)。

if(engine.ObjectOperations.IsCallable(myfunction)) 
    engine.ObjectOperations.Invoke(myfunction, args); 

這就是說,一個強類型的代表(你自己的System.ActionSystem.Func,或一個)是一個更好的選擇。如果不能更改功能簽名,則可以使用engine.ObjectOperations.ConvertTo來獲取委託。

2

有一個類似的問題在這裏:

How to pass a lambda expression to a C# constructor from an IronPython script?

當時的想法是使用System.Action代表接受Python函數,然後再執行該委託就像使用任何其他。我不是100%確定,但我認爲只要您的System.Action委託匹配,它就可以與IronPython lamda一起工作。

我希望這對你的作品。

+0

或者System.Func如果你需要一個返回類型。 – 2010-01-11 17:23:17

0

好吧,我想通了:

var target = myfunction.__code__.Target; 
result = target.DynamicInvoke(new object[] {myfunction, argsForFunction}) 

其中myFunction是一個PythonFunction實例。

+0

更喜歡使用engine.ObjectOperations,而不是依靠implmentation的細節。 – 2010-01-11 17:37:26

+0

你說得對。我給你答案。謝謝! – 2010-02-03 00:55:37