2009-04-28 6 views
5

मैं अपने सी # raytracer जो अब तक एक हवा भले ही मैं पूरी तरह से अजगर करने के लिए नया हूँ किया गया है में एक IronPython scritping इंजन को एकीकृत कर रहा हूँ। हालांकि, एक विशेष बात है कि मुझे मदद चाहिए।कैसे एक IronPython स्क्रिप्ट से एक सी # निर्माता के लिए एक लैम्ब्डा अभिव्यक्ति पारित करने के लिए?

public CameraAnimation(Action<Camera, float> animation) 

सी # में, मैं तो इस तरह का दृष्टांत हैं:

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

मैं काफी समझ नहीं कैसे के लिए एक समान काम करने के लिए मैं एक सी # वर्ग जो इस तरह एक निर्माता को परिभाषित करता है है आयरनपीथन में एक्शन ऑब्जेक्ट, तो पाइथन सिंटैक्स कैसा दिखता है?

+2

आप * विफलता * प्रयास के कुछ सूची चाहेंगे? मुझे यकीन है कि हम सभी आपके * विफलता * से सीख सकते हैं। (http://www.codinghorror.com/blog/archives/000576.html) – Sung

+0

हे, अगर आप जोर देते हैं। सी # कोड को पायथन में कनवर्ट करने का मेरा तरीका सी # को एक .py फ़ाइल में पेस्ट करना था और इसे संकलित किए जाने तक सामान हटा देना था। यह ज्यादातर काम करता था लेकिन दुर्भाग्य से मुझे स्पष्ट बिंदु से विचलित कर दिया कि मुझे सिर्फ एक समारोह घोषित करना चाहिए और इसे पैरामीटर के रूप में पास करना चाहिए। –

+0

चिंता मत करो। मैंने भी यही किया। :) –

उत्तर

2

मान लिया जाये कि मैं यह सही व्याख्या की है, और कार्रवाई के लिए एक सामान्य प्रतिनिधि, नीचे काम करता है (स्टब्स मैं प्रयोग किया जाता शामिल किए गए हैं) है।

पायथन:

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 रिक्त है। 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 का संदर्भ है। जैसा कि ध्यान दिया गया है, अब मैं इसे काम कर रहा हूं। –

संबंधित मुद्दे