2010-01-07 89 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