在c#中使用string动态打开现有表单

本文关键字:表单 动态 string | 更新日期: 2023-09-27 18:08:41

我正在尝试打开动态附加在菜单栏中的表单。

我的代码是:

形式frm;

string formName =((ToolStripMenuItem)sender).Text;
formName = Assembly.GetEntryAssembly().GetName().Name + "." + formName;
Type type = Type.GetType(formName);
frm = (Form)Activator.CreateInstance(type);           
frm.Show();

问题在这里。我得到了类型的null值。

在c#中使用string动态打开现有表单

您混淆了程序集名称(Assembly.GetEntryAssembly().GetName().Name)和名称空间。

您需要找到表单的真正的完全限定类名。如果您知道名称空间(即所有表单的名称空间总是相同的),您可以简单地硬编码它。另一种解决方案是使用反射枚举GetEntryAssembly程序集中的所有类型,然后检查该类型是否代表具有给定名称的表单。

如果您不知道完全限定名,您可以迭代程序集中的类型并找到您感兴趣的类型。

var q = from t in Assembly.GetExecutingAssembly().GetTypes()
        where t.IsClass && t.Name.Equals(formname) && t.IsSubclassOf(typeof(Form))
        select t;