我的情况是这样的:我正在使用Visual C# 2010 express开发Windows Forms应用程序。当用户登录时,从数据库表中动态构建一个菜单栏。在该表中,我保存id、选项名称和窗体名称。
因此,假设在我的项目中我有一个名为“会计”的表单,它具有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 变量为空。
我做错了什么?谢谢。