C# 反射调用类中的方法(在类未实例化前)

时间:2022-01-07 05:19:08
好吧,我承认标题有点饶.事情是这样的....


我要实现一个动态菜单,菜单的单击事件是用的反射
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()?

我对反射没了解,请小附下代码,顺便注释下,谢谢

7 个解决方案

#1


该回复于2009-08-18 15:58:44被版主删除

#2


upupup

#3


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

#4


Assembly.Load("MSystem").CreateInstance
这样调用要求必须有一个无参的构造函数的
至于是不是可以为静态,忘记了

至于你的问题
但这样的话发现一个问题.就是如果不停地单击同一菜单,窗体会不停地实例化.

Form f = (Form)Assembly.Load("MSystem").CreateInstance("MSystem.frmAgentList");
可不可以在外面把你的 f 设置为静态,
然后加判断:if( f == null ){ create instance } f.xxxx
貌似也可以解决你的不停的实例化的问题

#5


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

这样 ?

#6


        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;
        }

#7


哦有解了

#1


该回复于2009-08-18 15:58:44被版主删除

#2


upupup

#3


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

#4


Assembly.Load("MSystem").CreateInstance
这样调用要求必须有一个无参的构造函数的
至于是不是可以为静态,忘记了

至于你的问题
但这样的话发现一个问题.就是如果不停地单击同一菜单,窗体会不停地实例化.

Form f = (Form)Assembly.Load("MSystem").CreateInstance("MSystem.frmAgentList");
可不可以在外面把你的 f 设置为静态,
然后加判断:if( f == null ){ create instance } f.xxxx
貌似也可以解决你的不停的实例化的问题

#5


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

这样 ?

#6


        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;
        }

#7


哦有解了