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 ...
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
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. –
Non preoccuparti. Ho fatto la stessa cosa :) –