2017-07-18 48 views
2

我使用以下代碼在運行時調用並打開表單(來自此論壇)。表單的名稱取決於用戶輸入:在運行時將可變參數傳遞給未知表單

// Method 
    private void ShowForm(string formToCall) 
    { 
     Type type = Type.GetType("MyForms." + formToCall); 
     var form = Activator.CreateInstance(type) as Form; 
    } 

    // Call 
    ShowForm("StationDef"); 

現在,某些表單需要參數,而有些不需要。我可以向ShowForm()方法添加一個默認值爲空的參數,然後只有當參數實際傳遞時纔會改變,但我無法弄清楚如何在這種情況下更改ShowForm()代碼以接受參數。

像這樣的東西不起作用:

private void ShowForm(string formToCall, object arg = null) 
    { 
     Type type = Type.GetType("MyForms." + formToCall); 
     var form = Activator.CreateInstance(type) as Form(arg); 
    } 

任何幫助將不勝感激。

+0

我不清楚什麼是問題n是。你想'arg'允許0或1個參數嗎?還是應該支持1個以上?你想用'arg'做什麼**? – mjwills

+0

如果你使用'JavaScriptSerializer',那麼你可以傳遞兩個字符串:ArgType,Arguments並獲得動態能力,而不必與C#扯上關係。在握手使用C#的同時,您將以JSON的形式發送,以使交換更加輕鬆。 –

回答

2

這不起作用,因爲as需要類型名稱,而不是構造函數調用。

var form = Activator.CreateInstance(type) as Form(arg); 

你能做什麼,而不是被傳遞你的參數給CreateInstance - 方法,像這樣:

var form = Activator.CreateInstance(type, arg) as Form; 

我建議你解析對Arg的object,這樣你就不會與其他重載版本干擾的CreateInstance

Further Reading

+0

此代碼不會產生錯誤,表明CreateInstance很高興,但它不顯示錶單。一個值爲1的int被作爲參數傳遞。 object [] ar = {arg}; var xtraForm = Activator.CreateInstance(type,ar)as XtraForm; 這裏顯然是錯的嗎? – PeterJ

+0

您必須傳遞的參數必須與構造函數中的參數相同,所以如果您的Form有一個包含對象數組的構造函數,那就沒問題了,但我想你想要的是我寫的上面:直接傳遞參數。 –

+0

太好了。謝謝您的幫助。 – PeterJ

4

也許你可以試試:

private void ShowForm(string formToCall, object[] args) 
{ 
    Type type = Type.GetType("MyForms." + formToCall); 
    var form = Activator.CreateInstance(type, args) as Form; 
} 

你甚至可以使它更 「友好」 這樣

private void ShowForm(string formToCall, params object[] args) 

而且使用這樣的:

ShowForm("MyForm", arg1, arg2); 
+0

非常感謝。 – PeterJ

相關問題