2017-02-12 105 views
0

我想將變量從一種形式傳遞給另一種形式。Activator.CreateInstance傳遞變量形式

這是在窗口2構造:

public Form2 (int getId,string getText) 

在Form1我試圖傳遞變量這樣

var obj = (Form)Activator.CreateInstance(Type.GetType("myproject.Form2"),1,"test"); 
obj.ShowDialog(); 

我收到提示:

Additional information: Constructor on type 'myproject.Form2' not found.

如何我可以傳遞一個變量嗎?

+3

有沒有[理由](http://meta.stackexchange。com/q/66377/147640)你首先使用的是Activator.CreateInstance? – GSerg

+0

Activator只有在動態類型的環境中才有意義,在編譯時不確定您要創建的對象是什麼。 – Hristo

+0

您正試圖調用Form2的構造函數,它帶有兩個參數。第一個是int類型的參數,第二個是字符串類型的參數。根據你提到的錯誤,你在Form2類中沒有這樣的構造函數。 – Jacob

回答

0

你應該投給Form2,不Form

我不知道問題在哪裏(如果你轉換爲正確的類型),但如果你有相應的構造函數,你的代碼對我來說工作正常。

你可以嘗試來傳遞參數爲object[]object陣列) - CreateInstance(Type type, object[] args),但你也可以通過你傳遞它們(因爲方法接受params object[] args)的方式傳遞參數。

試圖取代這一行:

var obj = (Form)Activator.CreateInstance(Type.GetType("myproject.Form2"),1,"test"); 

本:

var obj = 
    (Form2)Activator.CreateInstance(Type.GetType("myproject.Form2"), new object[] {1, "test"}); 

此外,您還可以使用typeof獲得Type例如:

var obj = (Form2)Activator.CreateInstance(typeof(Form2), new object[] {1, "test"}); 

但是,如果你知道哪些在編譯時創建的實例類型,您應該簡單地使用012創建對象:

var obj = new Form2(1, "test"); 
+0

@LuisVito,它真的解決了這個問題嗎?因爲你的代碼適合我。 –

2

據我瞭解,你濫用Activator類。你應該使用的是'new'關鍵字來創建對象,因爲你很清楚你將要創建的類型。

下面是它應該是什麼樣子:

var obj = new Form2(1,"test"); 

使用Activator類纔有意義,當你不知道什麼,你將真正創造的類型是什麼。

2

爲什麼不在不使用反射的情況下創建表單的實例?

Form2 frm2 = new Form2(1, "test"); 
frm2.ShowDialog(); 

如果你想使用反射你的代碼應工作提供了Form2類是在同一組件上的「MyProject的」命名空間中定義的一些原因。

namespace myproject 
{ 
    public class Form2 : Form 
    { 
     public Form2 (int getId, string getText) 
     { 
      InitializeComponent(); 
     } 
    } 
} 

如果在另一個程序集中定義你應該閱讀:

Resolve Type from Class Name in a Different Assembly