我一直在试验一个应用程序,该应用程序将扫描一个程序集,检查是否有任何属于表单的类,然后查看它们有哪些成员。
我用来查询程序集的代码是:
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
的类型。
最佳答案
您正在尝试创建一个 Assembly 的实例,而不是您的表单的实例:
Type formType = testAssembly.GetType();
Object form = Activator.CreateInstance(formType);
你应该这样做:
Object form = Activator.CreateInstance(type);
顺便说一句,我不会使用类的名称来检查它是否派生自 Form,您可以使用 IsSubclassOf:
type.IsSubclassOf(typeof(Form));
关于c# - 创建表单实例时的反射错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7633774/