C#WinForm 窗体单例模式 反射单例

做了个mdi窗体 原以为指定一下MDIParent就可以了

没想到多次点击会出现多个窗体的现像 所以用到了单例模式

做法是这样的(学习出处:连接)

1.在子窗体声明一个子窗体类型的私有静态变量 并把子窗体构造函数设为 私有 不私有也行不过单例调用时不要用new方法

private static frmAACar fc = null;
private frmAACar()
      {
          InitializeComponent();

       }

2.声明一个public 静态函数 判断变量fc。不存在或只是关掉了 就new出来 

   public static frmAACar CreateSingle()
        {
            if (fc == null || fc.IsDisposed)
            {
                fc = new frmAACar();
            }

            return fc;
        }

3.调用

 frmAACar f = frmAACar.CreateSingle();
            f.Show();

4.多个窗体使用泛型 (约定了 必须有个无参的构造函数 调用时对应的窗体构造函数应为public )

//这里窗体是dotnetBar里的窗体继承来的,普通窗体继承Form就可以了  
public class GenericSingleton<T> where T : DevComponents.DotNetBar.Metro.MetroForm, new()
    {
        private static T t = null;

        public static T CreateSingleton()
        {
            if (t == null || t.IsDisposed)
            { t = new T(); }

            return t;
        }
    
    }

调用

frmAACar fc=  GenericSingleton<frmAACar>.CreateSingleton();
            fc.MdiParent = this;
            fc.Show();

反射单例

 /// <summary>
        ///通过反射创建子窗体
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            Type t = Assembly.Load("TestForm").GetType("TestForm.Form4");
            Form fc = (Activator.CreateInstance(t) as Form);
            if (!ShowChildForm(fc.Text, this))//通过name判断会更好一些 毕竟name不会重名
            {
                fc.MdiParent = this;
                fc.Show();
            }
            else
            {
                fc.Dispose();
            }
        }

        /// <summary>
        /// 判断子窗体是不是存在
        /// </summary>
        /// <param name="sonText"></param>
        /// <param name="MdiParentForm"></param>
        /// <returns></returns>
        public static bool ShowChildForm(string sonText, Form MdiParentForm)
        {

            foreach (var mdic in MdiParentForm.MdiChildren)
                if (mdic.Text == sonText)
                {
                    mdic.BringToFront();
                    return true;
                }

            return false;
        }
原文地址:https://www.cnblogs.com/SoftWareIe/p/8709618.html