好吧,我承认标题有点饶.事情是这样的....
我要实现一个动态菜单,菜单的单击事件是用的反射
Form f = (Form)Assembly.Load("MSystem").CreateInstance("MSystem.frmAgentList");frmAgentList是一个窗体来的
但这样的话发现一个问题.就是如果不停地单击同一菜单,窗体会不停地实例化.所以在frmAgentList中,我加了一个静态方法
        public static frmAgentList GetInstance()
        {
            if (f == null || f.IsDisposed)
            {
                f = new frmAgentList();
            }
            return f;
        }这样就只会返回一个实例了.但问题是我应该怎么样写才能不用CreateInstance面直接调用GetInstance()?我对反射没了解,请小附下代码,顺便注释下,谢谢

解决方案 »

  1.   

    Form f = (Form)Assembly.Load("MSystem").GetType("MSystem.frmAgentList").GetMethod("GetInstance").Invoke(null, null)
      

  2.   

    Assembly.Load("MSystem").CreateInstance
    这样调用要求必须有一个无参的构造函数的
    至于是不是可以为静态,忘记了至于你的问题
    但这样的话发现一个问题.就是如果不停地单击同一菜单,窗体会不停地实例化.Form f = (Form)Assembly.Load("MSystem").CreateInstance("MSystem.frmAgentList");
    可不可以在外面把你的 f 设置为静态,
    然后加判断:if( f == null ){ create instance } f.xxxx
    貌似也可以解决你的不停的实例化的问题
      

  3.   

      public static Form f;
            public static Form F()
            {
                if (f == null || f.IsDisposed)
                {
                    f = (Form)Assembly.Load("MSystem").CreateInstance("MSystem.frmAgentList");
                }
                return f;
            }这样 ?
      

  4.   

            public static frmAgentList GetInstance()
            {
                if (f == null || f.IsDisposed)
                {
                    f = new frmAgentList();
                }
                return f;
            }对于这一段,建议改成这样:使用双检校机制
            public static frmAgentList GetInstance()
            {
                if (f == null || f.IsDisposed)
                {
                    lock(typeof(frmAgentList))
                    {
                        if( f== null )
                        {
                            f = new frmAgentList();
                        }
                    }
                }
                return f;
            }