下一个是我的情况:我正在与Visual C#2010 Express合作开发Windows窗体应用程序。当用户登录时,使用从数据库表中加载的选项来动态地构建一个菜单栏。在该表中,我保存ID,选项名称和表单名称。

因此,假设在我的项目中我有一个名为Contabilidad的表单,它有Contabilidad.cs作为主类,因此,如果我想创建一个新表单并显示它,请执行以下操作:

Contabilidad frmConta = new Contabilidad();
frmConta.Show();

但是在这种情况下,因为菜单选项存储在数据库中,所以在数据库i中仅包含字符串“Contabilidad”。因此,我想使用C#反射来创建Contabilidad的实例或仅具有字符串格式的类名的任何其他形式。

首先,我尝试了这个:
Form frmConta= (Form)Activator.CreateInstance(null, "Contabilidad").Unwrap();

因为我在StackOverflow问题中读到,如果我使用null,则是指当前程序集(我的表单都在同一个项目中),但是却收到此消息:
Could not load type 'Contabilidad' from assembly 'AccountingSA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

下一个类定义:
namespace AccountingSA {
public partial class Contabilidad : Form
{
    public Contabilidad()
    {
        InitializeComponent();
    } ...

我也试过这个:
Assembly assembly = Assembly.Load("AccountingSA");
Type t = assembly.GetType("Contabilidad");
Form frmConta = (Form)Activator.CreateInstance(t);

但是我收到此消息的ArgumentNullException:
Value cannot be null. Parameter name: type

因为t变量为null。

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

最佳答案

使用类型的标准名称:

Type t = assembly.GetType("AccountingSA.Contabilidad");

Assembly.GetType(string) 的文档中:

关于C#反射: Instantiate an object with string class name,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7052508/

10-11 02:26