Ошибка отражения при создании экземпляра формы - PullRequest
1 голос
/ 03 октября 2011

Я экспериментировал с приложением, которое будет сканировать сборку, проверять наличие классов, которые являются формами, и затем видеть, какие члены у них есть.

Код, который я использую для запроса сборок:

 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 ]

5 голосов
/ 03 октября 2011

Вы пытаетесь создать экземпляр Assembly, а не вашей формы:

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

Вы должны сделать:

     Object form = Activator.CreateInstance(type);       

Кстати, я бы не использовал имя класса, чтобы проверить, является ли он производным от Form, вы можете использовать IsSubclassOf:

     type.IsSubclassOf(typeof(Form));
1 голос
/ 03 октября 2011

Форма объекта = Activator.CreateInstance ( тип );

...