private void CommonModel_Click(object sender, EventArgs e)
        {
            #region 通过反射创建窗体
            ToolStripMenuItem tsmi = sender as ToolStripMenuItem;
            
            string className = tsmi.Tag.ToString();//这里用tag,因为我们早就把菜单的每一项的tag都给值了(在窗体上)            if (Exists(tsmi.Text))
            {
                return;
            }            
            //反射
            Type type = Type.GetType("MenuSkin." + className);//typeof()//项目名比窗体高一级
            object obj = Activator.CreateInstance(type);            Form form = obj as Form;
            form.MdiParent = this;
            
            #endregion            #region 为窗体指定事件处理函数
            form.Activated += new EventHandler(form_Activated);
            form.Leave += new EventHandler(form_Leave);
            form.FormClosing += new FormClosingEventHandler(form_FormClosing);
            #endregion
            
            //这句代码一定要在最后
            form.Show();
        }
可以帮忙解读一下代码吗?

解决方案 »

  1.   

    就是可以通过类名创建这个对象。比如 tsmi.Tag 为 "fm1",那么这段代码等效:            MenuSkin.fm1 form = new MenuSkin.fm1();
                form.MdiParent = this;
     
                form.Activated += new EventHandler(form_Activated);
                form.Leave += new EventHandler(form_Leave);
                form.FormClosing += new FormClosingEventHandler(form_FormClosing);            form.Show();
      

  2.   


    if (Exists(tsmi.Text))
                {
                    return;
                }Type type = Type.GetType("MenuSkin." + className);//typeof()//项目名比窗体高一级
                object obj = Activator.CreateInstance(type);            Form form = obj as Form;
                form.MdiParent = this;
                
                            
                form.Activated += new EventHandler(form_Activated);
                form.Leave += new EventHandler(form_Leave);
                form.FormClosing += new FormClosingEventHandler(form_FormClosing);
                
    1:这几段可以细讲一下吗?
    2:form.Activated += new EventHandler(form_Activated);//括号里为什么要放这个东西
       form.Leave += new EventHandler(form_Leave);
       form.FormClosing += new FormClosingEventHandler(form_FormClosing);
      

  3.   

    Type type = Type.GetType("MenuSkin." + className);//typeof()//项目名比窗体高一级
    //获取类信息            object obj = Activator.CreateInstance(type);
    //创建实例 相当与 MenuSkin.Form _Form =new MenuSkin_Form();            Form form = obj as Form;                 form.MdiParent = this;            
                            
                form.Activated += new EventHandler(form_Activated);
    //当窗体为活动窗体发生  form_Activated为方法名.
                form.Leave += new EventHandler(form_Leave);
    //窗体光标离开事件
                form.FormClosing += new FormClosingEventHandler(form_FormClosing);
    //给窗体增加关闭事件
                
      

  4.   

    private void CommonModel_Click(object sender, EventArgs e) //模块点击事件,想用反射做到不变应万变ToolStripMenuItem tsmi = sender as ToolStripMenuItem;//根据菜单项来加载对应的模块信息
    string className = tsmi.Tag.ToString();//模块信息放在了菜单项的Tag中if (Exists(tsmi.Text)) //猜想可能是做什么模块是否已经加载的判断
                {
                    return;
                }Type type = Type.GetType("MenuSkin." + className);//typeof()
                object obj = Activator.CreateInstance(type);            Form form = obj as Form;
                form.MdiParent = this;
    //如上这一段是根据菜单项的Tag,获取到模块的入口窗体,然后用反射动态创建该窗体实例form.Activated += new EventHandler(form_Activated);
                form.Leave += new EventHandler(form_Leave);
                form.FormClosing += new FormClosingEventHandler(form_FormClosing);//给这个动态创建的窗体增加一些基本事件
      

  5.   

    Type type = Type.GetType("MenuSkin." + className);获取类信息(有一个类似清单的东西包含类的信息,是个xml文件)
    object obj = Activator.CreateInstance(type); 根据类信息常见该类的实例form.Activated += new EventHandler(form_Activated) 给事件绑定方法,具体在详细的查看一下委托和事件你就明白了