根据类名实例化一个对象(反射)

时间:2022-01-06 05:23:12

    最近在CSDN上看到一个06年的帖子,楼主提问如下:

    Q:在开发WinForm程序中需要这样一个函数:   
       输入一个Form的类名,在函数中判断该类是否存在,然后判断该类是否有实例存在,如存在则Show出来,如不存在则实例化一个,再Show出来。

    原帖地址:http://topic.csdn.net/t/20060414/18/4687803.html

    虽然回帖提到使用反射能解决这个问题,但最后貌似帖子无疾而终了,那我就顺着反射这个切入点继续把问题解决方案补充完整吧。

    MYAnswer:

 

根据类名实例化一个对象(反射)根据类名实例化一个对象(反射)通过反射判断程序中特定类名的窗体是否已打开,打开则显示,未打开则新建并打开
 1  Assembly tempAssembly  =  Assembly.GetExecutingAssembly(); // 反射得到包含当前运行代码所在程序集
 2  // 通过反射得到欲查找窗体类的一个实例,"MPM_ManagementSystem.FormAbout"为欲查找的窗体类的全名
 3  Form frm  =  (Form)tempAssembly.CreateInstance( " MPM_ManagementSystem.FormAbout " true );
 4  int  index =- 1 ;
 5  // 遍历当前应用程序打开的窗体集合
 6 for  ( int  i  =   0 ; i  <  Application.OpenForms.Count; i ++ )
 7  {
 8        // 判断当前打开的窗体中是否有与frm同名的,有则表示已打开MPM_ManagementSystem.FormAbout的一个窗体实例
 9        if  (frm.Name == Application.OpenForms[i].Name)
10      {
11          index  =  i; // 有则获取此窗体在当前窗体集合中的索引值 
12      }
13  }
14  if  (index  >   0 ) // 已存在该窗体
15  {
16      frm.Dispose(); // 既然已经打开了,我就灭掉你,你的出生也许是个错误,哎。。。- -!
17      MessageBox.Show( " 已打开名为 " + Application.OpenForms[index].Name + " 的窗口 " , " 提示 " );
18      Application.OpenForms[index].Focus(); // 前端显示已打开的窗体
19  }
20  else
21  {
22      MessageBox.Show( " 将新建名为 " + frm.Name + " 的窗口 " " 提示 " );
23      frm.Show();
24  }