C#Reflection:使用字符串类名实例化对象
我的情况是下一个:我正在使用Visual C#2010 express开发Windows Forms应用程序。 当用户登录时,使用从数据库表加载的选项来构建menustrip。 在该表中,我保存id,选项名称和表单名称。
所以,假设在我的项目中我有一个名为Contabilidad的Form,它有一个主类的Contabilidad.cs,所以如果我想创建一个新表单并显示它我这样做:
Contabilidad frmConta = new Contabilidad(); frmConta.Show();
但在这种情况下,因为菜单选项存储在数据库中,所以在数据库中我只有字符串“Contabilidad”。 因此,我想使用C#reflection来创建一个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)
的文档:
name类型:System.String类型的全名。 […] name参数包括命名空间,但不包括程序集。
您正在尝试使用类的名称而不指定名称空间。 这应该没问题:
Assembly assembly = Assembly.Load("AccountingSA"); Type t = assembly.GetType("AccountingSA.Contabilidad"); Form frmConta = (Form)Activator.CreateInstance(t);
每个版本的GetType
需要完全限定的类型名称; 使用Assembly.GetType
的好处是至少你不需要也包含程序集名称,但是如文档所述,你仍然需要命名空间:
name参数包括命名空间,但不包括程序集。
请注意,为了在将来诊断类似的东西,在第二行之后查看t
的值是值得的 – 它将为null,这就是第三行抛出exception的原因。
您应该添加命名空间:
assembly.GetType("AccountingSA.Contabilidad");
试试这个
Form frmConta= (Form)Activator.CreateInstance(null, "AccountingSA.Contabilidad").Unwrap();
尝试以这种方式指定您的类:
ContabilidadNamespace.Contabilidad, ContabilidadAssembly
在线程中回答太迟了,但是在当前的.NET框架(4.7)中,早期的答案不起作用(行汇编程序集= Assembly.Load(“AccountingSA”);总是抛出FileIOException)。 目前,工作代码是(直接使用类型)
Type t = Type.GetType("AccountingSA.Contabilidad"); Form frmConta = (Form)Activator.CreateInstance(t);
或使用Assembly的其他方式
上述就是C#学习教程:C#Reflection:使用字符串类名实例化对象分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
Assembly assembly = typeof(Form).Assembly; Type t = assembly.GetType("AccountingSA.Contabilidad"); Form frmConta = (Form)Activator.CreateInstance(t);
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1010742.html