执行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