2011-08-13 12 views
9

私の状況は次のとおりです。Visual C#2010 ExpressでWindowsフォームアプリケーションを開発中です。ユーザーがログインすると、データベース表からオプションをロードしてmenustripを作成します。そのテーブルでは、ID、オプション名、フォーム名を保存します。C#Reflection:文字列クラス名でオブジェクトをインスタンス化する

だから、それはメインクラスですContabilidad.csを持って、私のプロジェクトで、私はContabilidadという名前のフォームがあると、私は新しいフォームを作成したい場合は、私はこれを行うことを示しています。

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

しかし、この場合、メニューオプションはデータベースに保存されているため、データベースには "Contabilidad"という文字列しかありません。ですから、私はC#reflectionを使用してContabilidadのインスタンスを作成するか、文字列形式のクラス名でしか他のフォームを作成しません。

まず私はこの試みた:私はnullを使用している場合、私は(私のフォームは、すべて同じプロジェクトにある)現在のアセンブリを参照するんだけど、私はこれを取得することをStackOverflowの質問に読むので

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

をメッセージ:

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を得る:T変数がnullであるため

Value cannot be null. Parameter name: type 

私は間違っていますか?前もって感謝します。

答えて

15

利用型の完全修飾名:Assembly.GetType(string)のドキュメントから

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

名タイプ: タイプのフルネーム可能System.String。 [...] nameパラメータには名前空間は含まれていますが、アセンブリは含まれていません。

12

名前空間を指定せずにクラスの名前を使用しようとしています。これは問題ないはず:

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

GetTypeのすべてのバージョンは、完全修飾型名が必要です。

nameパラメータは、名前空間ではなく、アセンブリが含まれています。Assembly.GetTypeを使用する利点は、少なくともあなたもアセンブリ名が含まれていますが、まだ名前空間を必要とする文書としてする必要がないということです将来的には類似した何かを診断する

注意、それは二行目の後にtの値を見て価値がされているだろう - それはnullになります、3行目は例外をスローした理由です。

1

あなたは、名前空間を追加する必要があります

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

は試してみてください。この

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

あなたのクラスをこのように指定してみてください:

ContabilidadNamespace.Contabilidad, ContabilidadAssembly 
0

その遅すぎるスレッドが答えることではなく、以前の答え、現在の.NETフレームワーク(4.7)では動作しません(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); 
です
関連する問題