请教大家一个问题,在C#开发winform中, 知道窗体的name值,怎样通过反射机制来创建对应的窗体(注:有多个窗体且不在同一个文件夹里)??????

解决方案 »

  1.   

    sorry,i dont know,hope next man solve it for youchinese wholesalers
      

  2.   

    程序和文件夹有什么关系?难道你要调用外部程序的窗口?如果知道窗口类的名字,用activator就可以创建实例了
      

  3.   


              Assembly a = Assembly.LoadFile(@"path/filename.dll|exe");//加载程序集
                string className = "namespace.classname";//完整的类名,包括命名空间
                Type t = Type.GetType(className);//根据类名获取类型
                MyForm f = Activator.CreateInstance(t) as MyForm;//根据类型创建窗体实例
    注意需要在工程中添加对该程序集的引用(主要是为了知道MyForm的类型
      

  4.   

    这问题我今天刚回答过一次 
    自己去看吧http://topic.csdn.net/u/20091224/16/fc7c99c2-7fd2-4f36-ad70-b9449970db4f.html
      

  5.   

    YourType yt;
    var types=Assembly.Load("xxx.dll").GetTypes();foreach(var item in types){
      if(item.Name=="name"){
        yt=item.GetConstructor(Type.EmptyTypes).Invoke(null) as YourType;
        break;
      }
    }//在指定程序集下查,查到你的类型,然后反射的调用 构造函数进行实例化。
      

  6.   

    Form myForm=Assembly.Load("程序集").CreateInstance("程序集.窗体名");
      

  7.   

    string path=AssemblyName; 
    string name=strName; Form fm=(Form)Assembly.Load(path).CreateInstance(name); 
    fm.MdiParent=this.ParentForm; 
    fm.Show(); 
    fm.Dock=DockStyle.Fill; 
      

  8.   

    activator 很简单的  知道 type 就行
      

  9.   

    贴一个正在进行的项目的实现方法吧,我做第一个项目C#
    大概思路是在 数据库中配置好实现的窗口类,和构造函数所需的参数
    客户端自动生成菜单,并且调用相应的窗口类,就是楼主说的反射
      MenuitemBean b = ((sender as ToolStripItem).Tag as MenuitemBean);
                 try
                {
                    Type tt = Type.GetType(b.CKL.Trim());
                    FormBasic f;
                    if (b.Params == "")
                    {
                        f = (FormBasic)Activator.CreateInstance(tt);
                    }
                    else
                    {
                        object[] param = b.Params.Split(',');
                        f = (FormBasic)Activator.CreateInstance(tt, param);
                    }
                    f.MKQD = b.MKBM;
                    f.MdiParent = this;
                    new ERPCommon.SaleSVR.Service().WriteOperateLog(ERPCommon.PublicVariable.User, b.MKBM, "进入", "进入模块");
                    f.FormClosed += new FormClosedEventHandler(f_FormClosed);
                    f.Show();
                    f.WindowState = (System.Windows.Forms.FormWindowState)b.CKZT;
                }
                catch (Exception ep)
                {
                    MessageBox.Show("模块清单中窗口类配置错误,类前需要命名空间!\n" + ep.Message);
                }
      

  10.   

    Assembly.Load("程序集").CreateInstance("程序集.窗体名/类名")是object类型的,要显式进行类型转换的。Form myForm=(Form)Assembly.Load(".dll").CreateInstance("程序集.窗体名/类名")
      

  11.   

    谢谢大家热情的帮助和建议,这段时间我也在探寻这个反射机制,综合大家的建议终于得到想要的效果。目前做的C/S模式的WINFORM程序中,做到权限控制这块,想通过窗体类的名称获取该窗体里的功能项目,主要包括toolBar,linkLabel,Button等,还好我把窗体类集中的放在同一个命名空间里,所以在利用反射机制的时候就比较简单。属于这几位朋友提供的方法的特例:
    主要代码是 : object _form = System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(formNameSpace+"."+formName, false);最后还是衷心的感谢大家的参与,谢谢......
      

  12.   

    加精
    http://www.icanwell.cn