如何从IronPython脚本将lambda表达式传递给C#构造函数?

Mor*_*sen 5 c# scripting lambda ironpython

我正在将一个IronPython scritping引擎集成到我的C#raytracer中,到目前为止,尽管我对Python完全不熟悉,但它仍然是轻而易举的.但是,有一件特别的事情,我需要帮助.我有一个C#类,它定义了一个这样的构造函数:

public CameraAnimation(Action<Camera, float> animation)
Run Code Online (Sandbox Code Playgroud)

在C#中,我会像这样实例化:

var camAnimation = new CameraAnimation((camera, time) => camera.Position += new Vector(1, 0, 0));
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何在IronPython中对Action对象进行类似的赋值,那么Python语法将如何呈现?

Mat*_*hen 2

假设我对此解释正确,并且 Action 是通用委托,则以下内容有效(包括我使用的存根)。

Python:

import clr
clr.AddReference("IronPythonDelegates")

import IronPythonDelegates

def camActionPy(camera, time):
  print "Camera: " + str(camera) + ", time: " + str(time)

IronPythonDelegates.CameraAnimation(camActionPy);
Run Code Online (Sandbox Code Playgroud)

CSharp:

namespace IronPythonDelegates
{
    public class Camera{}

    public class CameraAnimation
    {
    private System.Action<Camera, float> animation;

    public CameraAnimation(System.Action<Camera, float> animation)
    {
        this.animation = animation;
        this.animation(new Camera(), 1.5f);
    }
    }
 }
Run Code Online (Sandbox Code Playgroud)

我更正了上面的内容以使用 System.Action,并且它不再需要显式反射。不过这有点奇怪。出于某种原因,我可以构建一个用户创建的委托,例如:

explicitTestAction = IronPythonDelegates.TestAction[IronPythonDelegates.Camera, System.Single](camActionPy);
IronPythonDelegates.CameraAnimation(explicitTestAction);
Run Code Online (Sandbox Code Playgroud)

但无法使用 System.Action 执行此操作。例如与

explicitSystemAction = System.Action[IronPythonDelegates.Camera, System.Single](camActionPy)
IronPythonDelegates.CameraAnimation(explicitSystemAction);
Run Code Online (Sandbox Code Playgroud)

显式系统操作为空。TestAction 刚刚定义为:

public delegate void TestAction<T1, T2>(T1 one, T2 two);
Run Code Online (Sandbox Code Playgroud)

但幸运的是,无论哪种方式,都可以这样做:

CameraAnimation(System.Action) 
Run Code Online (Sandbox Code Playgroud)

或者

CameraAnimation(TestAction)
Run Code Online (Sandbox Code Playgroud)

虽然出于某种原因我不记得我第一次尝试时的工作...