執行PythonFunction這裏的情況。我希望能夠爲Python拉姆達傳遞到C#方法,其中拉姆達的評價應該發生。當我傳入lambda時,它變成了一個PythonFunction的實例。我被困在這裏,因爲我不知道如何執行這個PythonFunction。我在這個類上看到一個「調用」,但我不知道在哪裏獲取它所需的CodeContext。(IronPython的)從C#
任何人都知道如何做到這一點?
執行PythonFunction這裏的情況。我希望能夠爲Python拉姆達傳遞到C#方法,其中拉姆達的評價應該發生。當我傳入lambda時,它變成了一個PythonFunction的實例。我被困在這裏,因爲我不知道如何執行這個PythonFunction。我在這個類上看到一個「調用」,但我不知道在哪裏獲取它所需的CodeContext。(IronPython的)從C#
任何人都知道如何做到這一點?
如果你不想(或不能)使用一個委託,該ObjectOperations
類是一個更好的選擇。距離engine.ObjectOperations
訪問(其中engine
是你ScriptEngine
實例)。
if(engine.ObjectOperations.IsCallable(myfunction))
engine.ObjectOperations.Invoke(myfunction, args);
這就是說,一個強類型的代表(你自己的System.Action
或System.Func
,或一個)是一個更好的選擇。如果不能更改功能簽名,則可以使用engine.ObjectOperations.ConvertTo
來獲取委託。
有一個類似的問題在這裏:
How to pass a lambda expression to a C# constructor from an IronPython script?
當時的想法是使用System.Action代表接受Python函數,然後再執行該委託就像使用任何其他。我不是100%確定,但我認爲只要您的System.Action委託匹配,它就可以與IronPython lamda一起工作。
我希望這對你的作品。
好吧,我想通了:
var target = myfunction.__code__.Target;
result = target.DynamicInvoke(new object[] {myfunction, argsForFunction})
其中myFunction是一個PythonFunction實例。
更喜歡使用engine.ObjectOperations,而不是依靠implmentation的細節。 – 2010-01-11 17:37:26
你說得對。我給你答案。謝謝! – 2010-02-03 00:55:37
或者System.Func如果你需要一個返回類型。 – 2010-01-11 17:23:17