Zakładając, że zinterpretowałem to dobrze, a Akcja jest ogólnym przedstawicielem, poniżej działa (stosowane są kody pośredniczące).
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);
}
}
}
poprawiłem wyżej używać System.Action, a to nie wymaga już wyraźne odbicie. To trochę dziwne. Z jakiegoś powodu, mogę zbudować delegata użytkownika tworzone jak:
explicitTestAction = IronPythonDelegates.TestAction[IronPythonDelegates.Camera, System.Single](camActionPy);
IronPythonDelegates.CameraAnimation(explicitTestAction);
ale nie mógł zrobić z System.Action. Na przykład. z
explicitSystemAction = System.Action[IronPythonDelegates.Camera, System.Single](camActionPy)
IronPythonDelegates.CameraAnimation(explicitSystemAction);
jawSystemAction ma wartość null. TestAction właśnie zdefiniowano jako:
public delegate void TestAction<T1, T2>(T1 one, T2 two);
Ale na szczęście tak czy inaczej jest w porządku, aby tylko zrobić:
CameraAnimation(System.Action)
lub
CameraAnimation(TestAction)
chociaż jakiegoś powodu nie pamiętam, że praca przy Najpierw spróbowałem ...
Czy mógłbyś wymienić niektóre * próby * niepowodzenia? Jestem pewien, że wszyscy możemy uczyć się z twojego * niepowodzenia *. (http://www.codinghorror.com/blog/archives/000576.html) – Sung
Heh, jeśli nalegasz. Moje podejście do konwersji kodu C# do Pythona polegało na wklejeniu C# do pliku .py i usunięciu plików do czasu ich kompilacji. To działało głównie, ale niestety odciągnęło mnie od dość oczywistego punktu, że powinienem zadeklarować funkcję i przekazać ją jako parametr. –
Nie martw się. Zrobiłem to samo. :) –