我要实现一个动态菜单,菜单的单击事件是用的反射
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
#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
貌似也可以解决你的不停的实例化的问题
这样调用要求必须有一个无参的构造函数的
至于是不是可以为静态,忘记了
至于你的问题
但这样的话发现一个问题.就是如果不停地单击同一菜单,窗体会不停地实例化.
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;
}
这样 ?
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;
}
{
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
#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
貌似也可以解决你的不停的实例化的问题
这样调用要求必须有一个无参的构造函数的
至于是不是可以为静态,忘记了
至于你的问题
但这样的话发现一个问题.就是如果不停地单击同一菜单,窗体会不停地实例化.
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;
}
这样 ?
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;
}
{
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
哦有解了