2011-10-03 54 views
1

我一直在試驗一個將掃描程序集的應用程序,檢查任何表單類,然後查看它們具有的成員。創建表單實例時的反射錯誤

我使用查詢組件的代碼是:

Assembly testAssembly = Assembly.LoadFile(assemblyPath); 

Type[] types = testAssembly.GetTypes(); 
textBox1.Text = ""; 

foreach (Type type in types) 
{ 
    if (type.Name.StartsWith("Form")) 
    { 
     textBox1.Text += type.Name + Environment.NewLine; 

     Type formType = testAssembly.GetType(); 
     Object form = Activator.CreateInstance(formType);  
     } 
} 

我使用這個查詢標準形式:

using System; 
using System.ComponentModel; 
using System.Windows.Forms; 

namespace TestForm 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

我的問題是,當代碼試圖Activator.CreateInstance(formType)那我得到一個異常說明:"No parameterless constructor defined for this object." 我還可以從檢查formType看到「DeclaringMethod:‘formType.DeclaringMethod’扔類型的異常'System.InvalidOperationException」

我不明白錯誤消息,因爲窗體有一個標準的構造函數,我是否錯過了一些非常明顯的東西?

編輯:type.Name顯示代碼試圖實例化爲Form1的類型。

+2

你肯定* *這是其失敗的類型,而不是一些其他類型的衛生組織e名稱以「Form」開頭? –

+0

type.Name.StartsWith(「Form」) - 不是檢查此類型是否爲表單的最佳方法 – username

+0

@JonSkeet - 我不確定其他類型可能是什麼,我正在查詢標準Windows窗體項目在VS2010中創建。 – GrandMasterFlush

回答

5

您正在嘗試創建裝配的實例,而不是你的形式:

 Type formType = testAssembly.GetType(); 
    Object form = Activator.CreateInstance(formType);  

你應該這樣做:

 Object form = Activator.CreateInstance(type);  

BTW,我不會使用這個類的名稱檢查它是否是從表格導出,可以使用IsSubclassOf:

 type.IsSubclassOf(typeof(Form)); 
+0

啊哈,賓果!發現得好。目前尚不清楚'formType'的用途是什麼...... –

+0

所有這些都是大驚小怪,它是一個錯字,很好的斑點弗朗切斯科,謝謝。我將自己的代碼放在我找到的幾個示例上,看起來我輸入了一個錯誤。 – GrandMasterFlush

1

Object form = Activator.CreateInstance(type);