2011-08-13 110 views
9

我的情況是下一個:我正在使用Visual C#2010 express開發Windows窗體應用程序。用戶登錄時,通過從數據庫表中加載的選項,建立一個菜單欄。在該表中,我保存了ID,選項名稱和表單名稱。C#反射:使用字符串類名稱實例化一個對象

因此,假設在我的項目,我有一個名爲Contabilidad形式,它具有Contabilidad.cs是主類,所以如果我想創建一個新的形式表現出來我這樣做:

Contabilidad frmConta = new Contabilidad(); 
frmConta.Show(); 

但在這種情況下,因爲菜單選項存儲在數據庫中,所以在數據庫中我只有字符串「Contabilidad」。所以,我想用C#反射來創建一個Contabilidad的實例或任何其他形式的字符串格式的類名。

首先我想這:

Form frmConta= (Form)Activator.CreateInstance(null, "Contabilidad").Unwrap(); 

因爲我在StackOverflow上的問題,如果我使用空我指的是當前組件(我的形式都在同一個項目)閱讀,但是我得到這個消息:

Could not load type 'Contabilidad' from assembly 'AccountingSA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. 

類定義是下一個:

namespace AccountingSA { 
public partial class Contabilidad : Form 
{ 
    public Contabilidad() 
    { 
     InitializeComponent(); 
    } ... 

此外,我試圖這樣:

Assembly assembly = Assembly.Load("AccountingSA"); 
Type t = assembly.GetType("Contabilidad"); 
Form frmConta = (Form)Activator.CreateInstance(t); 

,但我得到ArgumentNullException此消息:

Value cannot be null. Parameter name: type 

由於變量t爲空。

我做錯了什麼?提前致謝。

回答

15

使用類型的完全限定名稱:

Type t = assembly.GetType("AccountingSA.Contabilidad"); 

從文檔Assembly.GetType(string)

名稱類型:System 類型的全名。 [...]名稱參數包含命名空間,但不包含程序集。

12

您正在嘗試使用類的名稱而未指定命名空間。這應該是罰款:

Assembly assembly = Assembly.Load("AccountingSA"); 
Type t = assembly.GetType("AccountingSA.Contabilidad"); 
Form frmConta = (Form)Activator.CreateInstance(t); 

GetType每一個版本需要完全限定的類型名稱;使用Assembly.GetType的好處是,至少你不用還包括裝配的名字,但文件仍然需要命名空間:

名稱參數包括命名空間,但不大會。

注意,診斷,今後類似的東西,它會一直值得一看的t第二行後的值 - 這將是空,這就是爲什麼第三行拋出異常。

1

您應該添加命名空間:

assembly.GetType("AccountingSA.Contabilidad"); 
1

試試這個

Form frmConta= (Form)Activator.CreateInstance(null, "AccountingSA.Contabilidad").Unwrap(); 
0

嘗試指定類這種方式:

ContabilidadNamespace.Contabilidad, ContabilidadAssembly 
0

爲時已晚,在線程來回答,但在當前的.NET框架(4.7)中,較早的答案不起作用(The line Assembly assembly = Assembly.Load(「AccountingSA」); a通常會拋出FileIOException)。目前,工作代碼是(使用直接型)

Type t = Type.GetType("AccountingSA.Contabilidad"); 
Form frmConta = (Form)Activator.CreateInstance(t); 

或其它方式使用程序集是

Assembly assembly = typeof(Form).Assembly; 
Type t = assembly.GetType("AccountingSA.Contabilidad"); 
Form frmConta = (Form)Activator.CreateInstance(t); 
相關問題