创建表单实例时的反射错误
我一直在试验一个将扫描程序集的应用程序,检查任何表单类,然后查看它们具有的成员。创建表单实例时的反射错误
我使用查询组件的代码是:
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
的类型。
您正在尝试创建装配的实例,而不是你的形式:
Type formType = testAssembly.GetType();
Object form = Activator.CreateInstance(formType);
你应该这样做:
Object form = Activator.CreateInstance(type);
BTW,我不会使用这个类的名称检查它是否是从表格导出,可以使用IsSubclassOf:
type.IsSubclassOf(typeof(Form));
啊哈,宾果!发现得好。目前尚不清楚'formType'的用途是什么...... –
所有这些都是大惊小怪,它是一个错字,很好的斑点弗朗切斯科,谢谢。我将自己的代码放在我找到的几个示例上,看起来我输入了一个错误。 – GrandMasterFlush
Object form = Activator.CreateInstance(type);
你肯定* *这是其失败的类型,而不是一些其他类型的卫生组织e名称以“Form”开头? –
type.Name.StartsWith(“Form”) - 不是检查此类型是否为表单的最佳方法 – username
@JonSkeet - 我不确定其他类型可能是什么,我正在查询标准Windows窗体项目在VS2010中创建。 – GrandMasterFlush