2009-04-28 11 views
5

Estoy integrando un motor de escrutinio IronPython en mi C# raytracer que, hasta ahora, ha sido muy sencillo aunque soy completamente nuevo en Python. Sin embargo, hay una cosa en particular con la que necesito ayuda. Tengo una clase C# que define un constructor de esta manera:¿Cómo pasar una expresión lambda a un constructor de C# desde un script de IronPython?

public CameraAnimation(Action<Camera, float> animation) 

En C#, me gustaría crear una instancia de este modo:

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

yo no puedo encontrar la manera de hacer una asignación similar para el objeto Action en IronPython, entonces, ¿cómo se vería la sintaxis de Python?

+2

¿Haría una lista de los intentos de * failure *? Estoy seguro de que todos podemos aprender de su * falla *. (http://www.codinghorror.com/blog/archives/000576.html) – Sung

+0

Heh, si insiste. Mi enfoque para convertir el código C# a Python era pegar C# en un archivo .py y eliminar cosas hasta que se compilara. Esto funcionó en su mayoría, pero desafortunadamente me distrajo del punto bastante obvio de que debería declarar una función y pasarla como parámetro. –

+0

No te preocupes. Yo hice lo mismo. :) –

Respuesta

2

Suponiendo que haya interpretado este derecho, y Action es un delegado genérico, a continuación funciona (los stubs que utilicé están incluidos).

Python:

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

corregí lo anterior para utilizar System.Action, y ya no requiere una reflexión explícita. Aunque es un poco extraño Por alguna razón, pude construir un delegado creada por el usuario como:

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

pero no podía hacerlo con System.Action. P.ej. con

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

explicitSystemAction es nulo. TestAction se acaba de definir como:

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

Pero, afortunadamente, de cualquier manera está bien simplemente hacer:

CameraAnimation(System.Action) 

o

CameraAnimation(TestAction) 

aunque por alguna razón que no recuerdo que el trabajo cuando Lo intenté por primera vez ...

+0

Nota, encontré System.Action, pero desafortunadamente cambiándolo para usar eso inexplicablemente rompió el código. Mirándolo ahora. –

+0

¿Agregó una referencia a System.Core.dll? System.Action se define en mscorlib pero System.Action se define en System.Core. –

+0

Sí, tengo una referencia a System.Core. Como notado, lo tengo trabajando ahora. –

Cuestiones relacionadas