我的情况如下:我正在使用 Visual C# 2010 Express 开发 Windows 窗体应用程序。当用户登录时,动态地构建一个菜单条,其中包含从数据库表加载的选项。在该表中,我保存 ID、选项名称和表单名称。
所以,假设在我的项目中我有一个名为 Contabilidad 的表单,它有 Contabilidad.cs 这是主类,所以如果我想创建一个新表单并显示它,我会这样做:
Contabilidad frmConta = new Contabilidad();
frmConta.Show();
但在这种情况下,因为菜单选项存储在数据库中,所以在数据库中我只有字符串“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 变量为空。
我做错了什么?提前致谢。