详细说明:我通过解析配置文件获取到我即将显示的form的name,然后我有根据这个字符串创建了一个object类型的实例,
          问我如何将其转化为对应的form类 ??
 或者有没有其他办法来查找我这个工程中是否包含name为该字符串的form,然后将其实例化显示??

解决方案 »

  1.   

    你从配置文件获取的name是要在Title里显示还是直接这个form的 ID就叫这个名
    如果只是标题显示你读出来的信息,那随便new一个form,然后把name= “” 就可以了。
      

  2.   

    反射获取。。
            Assembly ass = Assembly.LoadFile("dll文件路径");//如果该DLL在你的BIN里面,你可以直接用
    //Assembly ass=Assembly.Load("dll名");
            Type t = ass.GetType("类的全名,命名空间+类名", false);        if(t==null)
                //则不存在
            else 
            {
                object obj=Activator.CreateInstance(t);
            }
      

  3.   

                string name = form的name;
                Form f;
                switch (name)
                {
                    case "Form1":
                        f = new Form1();
                    case "Form2":
                        f = new Form2();
                        ......
                }
      

  4.   

    可以使用反射的办法是最好的。请高手来帮忙。我提供一个不是很好的办法,就是用if语句判断。
    if(str == "...") .....
    else if()(str == "...") .....一般这些form都有一个相同的base类,优化一下:
    先创建一个Dictionary
    Dictionary<string, Type> CreationInfo = new Dictionary<string, Type>();
    CreationInfo .Add(str,         typeof(formName1));
    CreationInfo .Add(str,         typeof(formName2));
    .......
    一个static的CreateInstanceCF方法:
    参数为1,str。 2,form初始化需要的参数List:lstValues 。
                Type typInstance = (Type)this.CreationInfo [str];
                object[] arrConstructionParams = new object[] { str, lstValues };
                try
                {
                    instance = (baseClass)Activator.CreateInstance(typInstance, arrConstructionParams);
                }
                catch(Exception ex)
                {
                    throw new Exception(ex.ToString());
                }
      

  5.   

    是,我现在已经将这个创建好了,可是他是object类型的,我如果将其转换为对应的form类型呢,因为之后要将其show出来!
      

  6.   

    Form frm1 = (Form)tt;
    frm1.show();tt就是你的OBJECT型 试试
      

  7.   

    object _Form =...你创建的FROMFrom _MyForm=(Form)_Form;_MyForm.Show();
      

  8.   

    回复9楼:
    出错:未割り当てのローカル変数 'obj' が使用されました。
      

  9.   

    给你一个我写好的函数        #region public Form GetForm(Form ParentForm, Type ChildFormType, Object[] Params, bool OnlyOne, bool IsShow, bool IsMaximize, bool SetMiddle) // 创建或获得MDI子窗口
            /// <summary>
            /// 创建或获得MDI子窗口
            /// </summary>
            /// <param name="ParentForm">MDI父窗口</param>
            /// <param name="ChildFormType">MDI子窗口类型</param>
            /// <param name="Params">参数</param>
            /// <param name="OnlyOne">是否只允许一个</param>
            /// <param name="IsShow">是否显示</param>
            /// <param name="IsMaximize">是否最大化</param>
            /// <param name="SetMiddle">是否设置为中间</param>
            /// <returns>MDI子窗口</returns>
            public Form GetForm(Form ParentForm, Type ChildFormType, Object[] Params, bool OnlyOne, bool IsShow, bool IsMaximize, bool SetMiddle)
            {
                if (OnlyOne)
                    foreach (Form CF in ParentForm.MdiChildren)
                        if (CF.GetType() == ChildFormType)
                        {
                            CF.BringToFront();
                            return CF;
                        }
                Form NewForm = null;
                if (Params == null)
                    NewForm = (Form)(Activator.CreateInstance(ChildFormType));
                else
                    NewForm = (Form)(Activator.CreateInstance(ChildFormType, Params));
                NewForm.MdiParent = ParentForm;
                NewForm.Icon = ParentForm.Icon;
                NewForm.Size = new Size(800, 600);
                if (IsMaximize)
                    NewForm.WindowState = FormWindowState.Maximized;
                if (SetMiddle)
                    NewForm.StartPosition = FormStartPosition.CenterScreen;
                if (IsShow)
                    NewForm.Show();
                HelpAgentControl.DoAction(new Consts.SERVICE_HELPAGENT_ACTION_OPENWINODW(), false);
                return NewForm;
            }
            #endregion
      

  10.   

    对了,这个是用来生成MDI子窗口的
      

  11.   

    我现在的代码:
     
    object obj;
                string className = "frmMainForm";            Assembly[] assemblys = AppDomain.CurrentDomain.GetAssemblies();
                bool is_find = false;            foreach (Assembly a in assemblys)
                {
                    if (a.GlobalAssemblyCache)
                        continue;
                    Type[] types = a.GetTypes();                foreach (Type t in types)
                    {
                        string tmp = t.ToString();
                        int i = tmp.LastIndexOf(className, StringComparison.OrdinalIgnoreCase);                    //确保匹配的是类名,而不是namespace
                        if (tmp.Length - className.Length == i)
                        {
                            if (!is_find)
                            {
                                //创建类实例
                                obj = a.CreateInstance(t.ToString());
                                is_find = true;                            //如果需要处理类库冲突,则不要中断循环
                                break;
                            }
                            else
                            {
                                //如果需要处理类库冲突,则throw
                                //throw new Exception("请使用更长的类限定名");
                            }
                        }
                    }
                }            Form frm = (Form)obj;
                frm.Show();可是出现错误,上面已经帖出来过的:
    未割り当てのローカル変数 'obj' が使用されました。
      

  12.   

    问题已解决:
    将object obj;改为object obj = null;
    不过还是谢谢各位了!