【问题标题】:(IronPython) Execute PythonFunction from C#(IronPython) 从 C# 执行 PythonFunction
【发布时间】:2010-02-04 01:09:06
【问题描述】:

情况如下...我希望能够将 python lambda 传递给 C# 方法,在该方法中应该对 lambda 进行评估。当我传入 lambda 时,它变成了 PythonFunction 的一个实例。我被困在这里,因为我不知道如何执行这个 PythonFunction。我在这个类上看到一个“call”,但我不知道从哪里获得它需要的 CodeContext。

有人知道怎么做吗?

【问题讨论】:

    标签: ironpython


    【解决方案1】:

    如果您不想(或不能)使用委托,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 一起使用。

      我希望这对你有用。

      【讨论】:

      • 或 System.Func 如果您需要返回类型。
      【解决方案3】:

      好的,我想通了:

      var target = myfunction.__code__.Target;
      result =  target.DynamicInvoke(new object[] {myfunction, argsForFunction})
      

      其中 myfunction 是 PythonFunction 实例。

      【讨论】:

      • 更喜欢使用 engine.ObjectOperations 而不是依赖于实现细节。
      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多