创建表单实例时的反射错误

问题描述:

我一直在试验一个将扫描程序集的应用程序,检查任何表单类,然后查看它们具有的成员。创建表单实例时的反射错误

我使用查询组件的代码是:

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

您正在尝试创建装配的实例,而不是你的形式:

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

你应该这样做:

 Object form = Activator.CreateInstance(type);  

BTW,我不会使用这个类的名称检查它是否是从表格导出,可以使用IsSubclassOf:

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

啊哈,宾果!发现得好。目前尚不清楚'formType'的用途是什么...... –

+0

所有这些都是大惊小怪,它是一个错字,很好的斑点弗朗切斯科,谢谢。我将自己的代码放在我找到的几个示例上,看起来我输入了一个错误。 – GrandMasterFlush

Object form = Activator.CreateInstance(type);