2009-04-28 5 views
5

Sto integrando un motore scritping IronPython nel mio raytracer C# che, finora, è stato un gioco da ragazzi anche se sono completamente nuovo a Python. C'è una cosa particolare, però, che ho bisogno di aiuto con. Ho un # di classe C che definisce un costruttore come questo:Come passare un'espressione lambda a un costruttore C# da uno script IronPython?

public CameraAnimation(Action<Camera, float> animation) 

In C#, vorrei istanziare questo modo:

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

Non riesco a capire come fare un incarico simile per l'oggetto Action in IronPython, quindi come apparirebbe la sintassi Python?

+2

Vuoi elencare alcuni dei * tentativi * di fallimento? Sono sicuro che tutti possiamo imparare dal tuo * fallimento *. (http://www.codinghorror.com/blog/archives/000576.html) – Sung

+0

Heh, se insisti. Il mio approccio alla conversione del codice C# in Python era quello di incollare il C# in un file .py e rimuovere le cose fino a quando non veniva compilato. Questo ha funzionato soprattutto, ma sfortunatamente mi ha distratto dal punto piuttosto ovvio che dovrei semplicemente dichiarare una funzione e passarla come parametro. –

+0

Non preoccuparti. Ho fatto la stessa cosa :) –

risposta

2

Supponendo che abbia interpretato questo diritto e Azione è un delegato generico, di seguito funziona (gli stub che ho usato sono inclusi).

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

ho corretto quanto sopra per usare System.Action, e non è più richiede riflessione esplicita. È un po 'strano però. Per qualche ragione, ho potuto costruire un delegato creati dagli utenti come:

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

ma non sono riuscito a farlo con System.Action. Per esempio. con

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

explicitSystemAction è null. TestAction era appena definita come:

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

Ma per fortuna in entrambi i casi è bene di fare proprio:

CameraAnimation(System.Action) 

o

CameraAnimation(TestAction) 

anche se per qualche motivo non mi ricordo che lavorare quando Ho provato per la prima volta ...

+0

Nota, ho trovato System.Action, ma sfortunatamente cambiandolo per usare quello ha rotto in modo inspiegabile il codice .. Guardandolo ora. –

+0

Hai aggiunto un riferimento a System.Core.dll? System.Action è definito in mscorlib ma System.Action è definito in System.Core. –

+0

Sì, ho un riferimento a System.Core. Come notato, lo sto facendo ora. –

Problemi correlati