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

标签 c# reflection system.reflection

我一直在试验一个应用程序,该应用程序将扫描一个程序集,检查是否有任何属于表单的类,然后查看它们有哪些成员。

我用来查询程序集的代码是:

 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/

相关文章:

c# - 调用接口(interface)方法,但 System.Reflection.MethodBase 设置为 System.Object

c# - 包含 silverlight 控件的母版页

c# - 异常与返回码 : do we lose something (while gaining something else)?

java - 从类中获取静态字段的值

Scala flatMap 通过 getConstructors 方法(反射)

c# - 将方法调用序列化为 JSON,然后反序列化并调用该方法

c# - 在 .Net Core 2.1 中使用 FirstOrDefault 时引发的 System.Linq.Expressions 异常

c# - 在 C# 中解析用引号引起来的 CSV 文件

android - 如何使用反射将 nfc_extras 添加到 android 项目?

azure - 如何对 Azure Functions 进行版本控制以便可以在运行时进行查询?