【发布时间】:2010-02-04 01:09:06
【问题描述】:
情况如下...我希望能够将 python lambda 传递给 C# 方法,在该方法中应该对 lambda 进行评估。当我传入 lambda 时,它变成了 PythonFunction 的一个实例。我被困在这里,因为我不知道如何执行这个 PythonFunction。我在这个类上看到一个“call”,但我不知道从哪里获得它需要的 CodeContext。
有人知道怎么做吗?
【问题讨论】:
标签: ironpython
情况如下...我希望能够将 python lambda 传递给 C# 方法,在该方法中应该对 lambda 进行评估。当我传入 lambda 时,它变成了 PythonFunction 的一个实例。我被困在这里,因为我不知道如何执行这个 PythonFunction。我在这个类上看到一个“call”,但我不知道从哪里获得它需要的 CodeContext。
有人知道怎么做吗?
【问题讨论】:
标签: ironpython
如果您不想(或不能)使用委托,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 实例。
【讨论】: