2009-04-28 6 views
5

IronPythonのスクリプティングエンジンを私のC#ray Tracerに統合しています。これまでのところ、Pythonを全く新しくしていましたが、これまでには簡単でした。しかし、私には助けが必要なことが1つあります。IronPythonスクリプトからラムダ式をC#コンストラクタに渡すにはどうすればいいですか?

のC#で
public CameraAnimation(Action<Camera, float> animation) 

、私はそうのように、これをインスタンス化します:

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

私はかなりのために同様の割り当てを作成する方法を見つけ出すことはできません私はこのようなコンストラクタを定義するC#クラスを持っていますIronPythonのActionオブジェクトですから、Pythonの構文はどのように見えますか?

+2

*失敗*試行のいくつかをリストしますか? 私は皆あなたの*失敗*から学ぶことができると確信しています。 (http://www.codinghorror.com/blog/archives/000576.html) – Sung

+0

あなたが主張するならば、ちょっと。 C#コードをPythonに変換する私のアプローチは、C#を.pyファイルに貼り付け、コンパイルするまで削除していました。これは主に機能しましたが、残念なことに、私は関数を宣言してパラメータとして渡す必要があるという明確な点から私を邪魔しました。 –

+0

心配しないでください。私も同じことをしました。 :) –

答えて

2

私はこの権利を解釈し、Actionは汎用代理人であると仮定すると、以下のものが使用されます(私が使用したスタブは含まれています)。

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

私はSystem.Actionを使用するには、上記を修正しないと、それはもはや、明示的な反射が必要です。それは少し変だけど。何らかの理由で、次のようなユーザー作成の代理人を作成することができました:

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

ただし、System.Actionではそうできませんでした。例えば。

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

explicitSystemActionがnullです。 TestActionはただのように定義された:

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

しかし幸いにもいずれかの方法は、それだけでやっていいのよ:

CameraAnimation(System.Action) 

または

CameraAnimation(TestAction) 

何らかの理由で、私は時に働いていることを覚えていないものの

私は最初に試しました...

+0

メモ、私はSystem.Actionを見つけましたが、残念ながらそれを使用してコードを壊しました。それを今見て。 –

+0

System.Core.dllへの参照を追加しましたか? System.Action はmscorlibで定義されていますが、System.Action はSystem.Coreで定義されています。 –

+0

はい、System.Coreへの参照があります。今述べたように、私はそれを今働いている。 –

関連する問題