代码之家  ›  专栏  ›  技术社区  ›  Morten Christiansen

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

  •  5
  • Morten Christiansen  · 技术社区  · 16 年前

    我正在将一个Ironpython脚本引擎集成到我的c raytracer中,到目前为止,这已经是轻而易举的事情了,尽管我对python还完全陌生。不过,有一件事我需要帮助。我有一个C类,它定义了一个这样的构造函数:

    public CameraAnimation(Action<Camera, float> animation)
    

    在C中,我将这样实例化:

    var camAnimation = new CameraAnimation((camera, time) => camera.Position += new Vector(1, 0, 0));
    

    我不太明白如何为Ironpython中的action对象进行类似的赋值,那么python的语法看起来如何?

    1 回复  |  直到 13 年前
        1
  •  2
  •   sll    13 年前

    假设我解释了这个权利,而action是一个通用委托,下面的工作(包括我使用的存根)。

    蟒蛇:

    import clr
    clr.AddReference("IronPythonDelegates")
    
    import IronPythonDelegates
    
    def camActionPy(camera, time):
      print "Camera: " + str(camera) + ", time: " + str(time)
    
    IronPythonDelegates.CameraAnimation(camActionPy);
    

    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);
        }
        }
     }
    

    我纠正了上述使用System.Action的方法,它不再需要显式反射。不过有点奇怪。出于某种原因,我可以构造一个用户创建的委托,比如:

    explicitTestAction = IronPythonDelegates.TestAction[IronPythonDelegates.Camera, System.Single](camActionPy);
    IronPythonDelegates.CameraAnimation(explicitTestAction);
    

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

    explicitSystemAction = System.Action[IronPythonDelegates.Camera, System.Single](camActionPy)
    IronPythonDelegates.CameraAnimation(explicitSystemAction);
    

    ExplicitSystemAction为空。测试被定义为:

    public delegate void TestAction<T1, T2>(T1 one, T2 two);
    

    但幸运的是,无论哪种方式,只要做到:

    CameraAnimation(System.Action) 
    

    CameraAnimation(TestAction)
    

    尽管出于某种原因,我不记得我第一次尝试工作时…

    推荐文章