2009-04-28 11 views
5

Integruję silnik do scrapowania IronPythona z moim raytracerem C#, który jak dotąd był lekki, mimo że jestem zupełnie nowy w Pythonie. Jest jedna konkretna rzecz, z którą potrzebuję pomocy. Mam klasy C#, który określa konstruktor takiego:Jak przekazać wyrażenie lambda do konstruktora C# ze skryptu IronPython?

public CameraAnimation(Action<Camera, float> animation) 

W języku C#, chciałbym instancję to tak:

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

nie mogę dość dowiedzieć się, jak zrobić podobny przypisania obiekt Action w IronPython, więc jak wyglądałaby składnia Pythona?

+2

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

+0

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. –

+0

Nie martw się. Zrobiłem to samo. :) –

Odpowiedz

2

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 ...

+0

Uwaga: Znalazłem System.Action, ale niestety zmieniłem go, aby użyć tego niewytłumaczalnie zepsuł kod. Patrzę na to teraz. –

+0

Czy dodano odniesienie do System.Core.dll? System.Action jest zdefiniowany w mscorlib, ale System.Action jest zdefiniowany w System.Core. –

+0

Tak, mam odniesienia do System.Core. Jak już wspomniano, mam to teraz działa. –