2013-04-07 48 views
1

我正在嘗試設置C#代碼以自動爲由IronPython腳本調用且尚未明確實現的方法創建虛擬或備用委託。在運行時動態創建備用代理

假設有一個腳本調用了非靜態的C#類方法「MoveTo」,它尚未在相應的類中實現。通常,如果它存在,則通過使用Method和委託實例的名稱調用「SetVariable」來創建相應的委託實例,並將其添加到腳本的作用域中。對於已經實現的方法來說,這很好。

如果該方法尚未實現的呼叫將不會失敗,而是被重定向到正常處理呼叫和假裝成功執行(這被認爲是在我的具體情況不加批判的)虛擬方法。

問題是:由IronPython腳本調用的方法有很多種簽名(實際上它們可以有任何可能的簽名類型)。因此,我想動態地創建一個後備代理,該代理獲得被調用方法的相同簽名,從而「捕獲」每個對尚未實現的方法的調用。

你們有什麼想法可以實現這個目標嗎?

+0

你能否進一步澄清你的問題並添加一些樣品?你說你通過SetVariable通過name/delegate添加它們來調用「非靜態C#類方法」。這是否意味着在您的python腳本中,它們看起來像全局/靜態/非成員函數,而不是CLR對象實例上的成員調用(但仍隱式綁定到非公開的CLR對象)?沒有任何方法返回任何東西? – 2013-04-07 11:45:40

+0

所以基本上你希望在運行時創建一個具有特定簽名的方法?你有沒有看過動態創建lambda表達式? – JJ15k 2013-04-07 11:46:02

+0

@SimonOpelt:沒錯。在IronPython中,它們看起來像全局函數。它們所屬的對象是一種單例,在整個應用程序中只有這個類的一個實例。該對象代表了一個硬件,一個更精確的機器人。 IronPython用於編寫機器人的行爲腳本。暴露的方法控制機器人的不同能力,如駕駛,轉彎,移動手臂等。 – 2013-04-07 18:24:14

回答

0

您應該能夠創建一個接受任何數量/類型參數的個數一個包羅萬象的方法:

object Fallback([ParamDictionary]IDictionary<object, object> kwargs, params object[] args) { 
    return null; // or whatever 
} 

(可悲的是,這是倒退從寫一個類似功能的正常Python是這樣:def foo(*args, **kwargs):。 )

如果不使用關鍵字指定參數時,你可以丟棄,只是使用params

object Fallback(params object[] args) { 
    return null; // or whatever 
} 

然後用.SetVariable("whatever", Fallback)使其成爲後備方法。

+0

我可以通過在運行時生成合適的Python代碼來創建一個,並在相應的範圍內執行。不幸的是,你的方法不起作用,因爲.SetVariable需要一個Delegate對象,並且在給定一個方法組時會奇怪地拋出一個錯誤。使用Delegate.CreateDelegate(...)創建委託不會工作,因爲生成的委託不適合調用的Python函數。好吧,無論如何,它現在就以我現在這樣做的方式工作。這很快,但我認爲它是可以接受的。不管怎麼說,還是要謝謝你! – 2013-04-10 23:30:43