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'' の例外をスローしたこともわかります」

フォームには標準のコンストラクターがあるため、エラー メッセージがわかりません。本当に明らかな何かが欠けていますか?

EDIT :type.Nameコードがインスタンス化しようとしている型を明らかにしますForm1

4

2 に答える 2

5

フォームではなく、アセンブリのインスタンスを作成しようとしています。

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

やったほうがいい:

     Object form = Activator.CreateInstance(type);       

ところで、私はクラスの名前を使用して、それがFormから派生しているかどうかを確認しません。IsSubclassOfを使用できます。

     type.IsSubclassOf(typeof(Form));
于 2011-10-03T10:42:18.590 に答える
1

オブジェクトフォーム=Activator.CreateInstance(type);

于 2011-10-03T10:40:56.617 に答える