C#Reflection:使用字符串类名实例化对象

Osc*_*ron 9 c# reflection

我的情况是下一个:我正在使用Visual C#2010 express开发Windows Forms应用程序.当用户登录时,以动态方式构建一个menustrip,其中包含从数据库表中加载的选项.在该表中,我保存了id,选项名称和表单名称.

所以,假设在我的项目中我有一个名为Contabilidad的Form,它有一个主类的Contabilidad.cs,所以如果我想创建一个新表单并显示它我这样做:

Contabilidad frmConta = new Contabilidad();
frmConta.Show();
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,因为菜单选项存储在数据库中,所以在数据库中我只有字符串"Contabilidad".所以,我想使用C#reflection来创建一个Contabilidad实例或任何其他只有字符串格式的类名的表单.

首先我试过这个:

Form frmConta= (Form)Activator.CreateInstance(null, "Contabilidad").Unwrap();
Run Code Online (Sandbox Code Playgroud)

因为我在StackOverflow问题中读到如果我使用null我指的是当前程序集(我的表单都在同一个项目中),但我收到此消息:

Could not load type 'Contabilidad' from assembly 'AccountingSA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
Run Code Online (Sandbox Code Playgroud)

类定义是下一个:

namespace AccountingSA {
public partial class Contabilidad : Form
{
    public Contabilidad()
    {
        InitializeComponent();
    } ...
Run Code Online (Sandbox Code Playgroud)

我试过这个:

Assembly assembly = Assembly.Load("AccountingSA");
Type t = assembly.GetType("Contabilidad");
Form frmConta = (Form)Activator.CreateInstance(t);
Run Code Online (Sandbox Code Playgroud)

但是我收到带有此消息的ArgumentNullException:

Value cannot be null. Parameter name: type
Run Code Online (Sandbox Code Playgroud)

因为t变量为null.

我做错了什么?提前致谢.

Ani*_*Ani 15

使用类型的完全限定名称:

Type t = assembly.GetType("AccountingSA.Contabilidad");
Run Code Online (Sandbox Code Playgroud)

从以下文档Assembly.GetType(string):

name类型:System.String类型的全名.[...] name参数包括命名空间,但不包括程序集.


Jon*_*eet 13

您正在尝试使用类的名称而不指定名称空间.这应该没问题:

Assembly assembly = Assembly.Load("AccountingSA");
Type t = assembly.GetType("AccountingSA.Contabilidad");
Form frmConta = (Form)Activator.CreateInstance(t);
Run Code Online (Sandbox Code Playgroud)

每个版本都GetType需要完全限定的类型名称; 使用的好处Assembly.GetType是至少你不需要也包括程序集名称,但是如文档所述,你仍然需要命名空间:

name参数包括命名空间,但不包括程序集.

请注意,为了在将来诊断类似的东西,将值得查看t第二行之后的值- 它将为null,这就是第三行引发异常的原因.