在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
在网上搜索通过类名动态创建对象,发现大多都是都是用System.Int32作为例子,并直接给出来了其完全限定名,对于怎样得到自定义类型的完全限定名的内容并不多,在此,我列出我对此的一点见解,希望对大家有所帮助。 private object GetInstanceByName(string className) { object obj; try { obj = Activator.CreateInstance(Type.GetType(className)); MessageBox.Show(obj.GetType().ToString()); } //创建Button实例的过程:Button btn=(Button)GetInstanceByName("System.Windows.Forms"); //btn.Parent=this; //Assembly asm = Assembly.LoadWithPartialName(className); //try //{ // obj = Activator.CreateInstance(asm.GetType(className + ".Button")); // MessageBox.Show(obj.GetType().ToString()); //} catch (Exception e) { throw new Exception("动态创建实例失败 \n\n=> " + className, e); } return obj; } 说明:className必须是完全限定名,如Int32的完全限定名是: private void button1_Click(object sender, EventArgs e) { //Int32 myInt=(Int32)GetInstanceByName("System.Int32"); //得到Assembly名字的方法: //对于自定义的数据类型,需要通过Assemebly类得到程序集的全名(其实就是反射机制) Assembly asm = Assembly.Load("Test"); //加载程序集,Test为程序集的名字 GetInstanceByName("Application1.Form1, " + asm.FullName); //Application1.Form1表示命名空间Application1中的一个类"Form1" MessageBox.Show(asm.FullName); } 3、动态库调用 Assembly assembly = Assembly.LoadFrom("MyTest.dll"); Type type = assembly.GetType("MyTest.MyClass"); object instance = Activator.CreateInstance(type); 补充:加载程序集有两个函数,Assembly.Load()和Assembly.LoadFrom()。Assembly.Load的参数是程序集的名称,运行库会在本地目录和全局程序集高速缓存内搜索该程序集;Assembly.LoadFrom()的参数是程序集的完成路径名,不会在其它位置搜索该程序集。 自定义ToolBox的实现会用到该技术。 |
请发表评论