这是情况......我希望能够将python lambda传递给C#方法,其中lambda的评估应该发生。当我传入lambda时,它变成了PythonFunction的一个实例。我被困在这里,因为我不知道如何执行这个PythonFunction。我在这个类上看到了一个“调用”,但我不知道它需要从哪里得到CodeContext。
任何人都知道怎么做?
答案 0 :(得分:4)
如果您不想(或不能)使用委托,ObjectOperations
类是更好的选择。可以从engine.ObjectOperations
访问它(engine
是ScriptEngine
个实例)。
if(engine.ObjectOperations.IsCallable(myfunction))
engine.ObjectOperations.Invoke(myfunction, args);
也就是说,强类型代表(System.Action
或System.Func
或您自己的代表)是更好的选择。如果不能选择更改函数签名,则可以使用engine.ObjectOperations.ConvertTo
来获取委托。
答案 1 :(得分:2)
这里有一个类似的问题:
How to pass a lambda expression to a C# constructor from an IronPython script?
我的想法是使用System.Action委托接受python函数,然后像执行其他任务一样执行该委托。我不是百分百肯定,但我认为只要您的System.Action委托匹配,它就可以与IronPython lamda一起使用。
我希望这适合你。
答案 2 :(得分:0)
好的,我明白了:
var target = myfunction.__code__.Target;
result = target.DynamicInvoke(new object[] {myfunction, argsForFunction})
其中myfunction是PythonFunction实例。