5

IronPython スクリプト エンジンを C# raytracer に統合しています。これまでのところ、Python はまったくの初心者ですが、簡単に実行できました。ただし、私が助けを必要としている特定のことが 1 つあります。次のようなコンストラクターを定義する C# クラスがあります。

public CameraAnimation(Action<Camera, float> animation)

C# では、次のようにインスタンス化します。

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

IronPython で Action オブジェクトに同様の割り当てを行う方法がよくわかりません。では、Python の構文はどのようになるでしょうか?

4

1 に答える 1

2

私がこの権利を解釈し、アクションが一般的なデリゲートであると仮定すると、以下が機能します (私が使用したスタブが含まれています)。

パイソン:

import clr
clr.AddReference("IronPythonDelegates")

import IronPythonDelegates

def camActionPy(camera, time):
  print "Camera: " + str(camera) + ", time: " + str(time)

IronPythonDelegates.CameraAnimation(camActionPy);

Cシャープ:

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)

どういうわけか、最初に試したときの動作を覚えていません...

于 2009-04-28T23:03:51.090 に答える