public partial class Form1 : BaseForm ...
public partial class Form2 : BaseForm ...

// 根据formString 参数显示对应的窗体
switch(formString)
{
case "Form1":
ShowForm<Form1>();
break;
case "Form2":
ShowForm<Form2>();
break;
}
如果有100个窗体,那就歇菜了,有没有类似  Eval("ShowForm<"+formString+">()") 的方法直接执行?
/// <summary>
        /// 显示窗体
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public void ShowForm<T>()where T : BaseForm, new()
{

}泛型

解决方案 »

  1.   

    http://msdn.microsoft.com/zh-cn/library/system.type.makegenerictype.aspx
      

  2.   

    什么乱七八糟的“范型”概念?你以为 ShowForm<Form1>() 这里的T是写对象实例啊?!晕。
      

  3.   

    很遗憾,你完全没有理解范型是什么东西。这也就可想而知你对“反射”的学习进度为什么会是完全无法入门了。所以还是要找个方法学进去点知识才行。就你问题而言,我认为不论是范型还是反射,我都不认为有什么必要。你的 ShowForm<Form1>() 谁只要要显示什么?难道定义为public void ShowForm(Form f)
    {
       
    }就不行吗?编程当然是要越简单越好,能少用class、少用方法、少写代码,当然越少越好。如果要写就要懂得需求驱动,等你有了那么大的需求时才应该使用高级的设计。不要为了范型而范型。为了炫技往往把自己搞死,弄出来诡异和累赘的东西。
      

  4.   


    主要是ShowForm方法里实例单件用到了泛型,所以不得已        /// <summary>
            /// 显示窗体,并置于最前端
            /// </summary>
            /// <typeparam name="T"></typeparam>
            public void ShowForm<T>()where T : BaseForm, new()
            {
                if (this.ActiveMdiChild != null)
                {
                    if (this.ActiveMdiChild is T) return;
                    else this.ActiveMdiChild.Close();  //关闭之前的窗体
                }
                if (this.LastMDIFormClosed)
                {
                    T f = Singleton<T>.Instance;                f.MdiParent = this;
                    f.Text = f.String_Subject;
                    f.WindowState = FormWindowState.Maximized;
                    f.Show();
                    f.BringToFront();
                }
            }    /// <summary>
        /// 泛型实现窗体实例单件化
        /// </summary>
        /// <typeparam name="T">窗体类</typeparam>
        public static class Singleton<T> where T : BaseForm, new()
        {
            private static T m_Instance = null;
            private static readonly object lockHelper = new object();
            /// <summary>
            /// 获取窗体的唯一实例
            /// </summary>
            public static T Instance
            {
                get
                {
                    if (m_Instance == null)
                    {
                        lock (lockHelper)
                        {
                            if (m_Instance == null)
                            {
                                m_Instance = new T();
                                m_Instance.FormClosing += new FormClosingEventHandler(FormClosing);
                                m_Instance.FormClosed += new FormClosedEventHandler(FormClosed);
                                
                            }
                        }
                    }
                    return m_Instance;
                }
            }
            /// <summary>
            /// 当窗体准备关闭之前发生
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            static void FormClosing(object sender, FormClosingEventArgs e)
            {
                m_Instance.OwnerForm.LastMDIFormClosed = false;
                if (m_Instance.Modified)
                {
                    switch (MessageBox.Show(m_Instance.String_SavingQuery, "保存提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1))
                    {
                        case DialogResult.Yes:
                            m_Instance.Save();
                            break;
                        case DialogResult.No:
                            break;
                        case DialogResult.Cancel:
                            e.Cancel = true;
                            break;
                    }            }
            }
            /// <summary>
            /// 当窗体关闭时将Instance置空
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private static void FormClosed(object sender, FormClosedEventArgs e)
            {
                m_Instance.OwnerForm.LastMDIFormClosed = true;
                m_Instance = null;
            }
        }
      

  5.   


    请赐教。小弟.net水平确实一般,且两年多没写程序了,转行干建筑行业了最近搞一个自用的管理软件,才重拾VS的