最近在做一个软件时,由于用了多文档窗体,MdiContrainer中的菜单主要是用于显示子窗体的,这些菜单数量较多,对菜单编程时我想用泛型编程,源代码如下(一个菜单):
//
T作为一个模板参数,这里想传一个类名,但是....
private void ShowMdiChild < T > ( string MdiChildName) where T : IComparable < T >
... {
T fm;
bool HasQuery=false;
foreach(Form frm in this.MdiChildren)
if (frm.Name == MdiChildName)
...{
frm.Activate();
HasQuery = true;
}
if (!HasQuery)
...{
fm = new T(); //不能这样new,提示:变量类型“T”没有 new() 约束,因此无法创建该类型的实例
fm.MdiParent = this; //也不能,提示:“T”并不包含“MdiParent”的定义
fm.Show(); //也不行,同上
}
}
// MenuItem为一个菜单,FrmAddProblem为一个窗体类,当然是由Form类继承下来的。
// 此菜单的Click事件是用于打开一个FrmAddProblem窗体,如果已经打开一个实例,则
// 将之前打开的激活,如果没有则new一个
private void MenuItem_Click( object sender, EventArgs e)
... {
ShowMdiChild<FrmAddProblem>("FrmAddProblem");
}
private void ShowMdiChild < T > ( string MdiChildName) where T : IComparable < T >
... {
T fm;
bool HasQuery=false;
foreach(Form frm in this.MdiChildren)
if (frm.Name == MdiChildName)
...{
frm.Activate();
HasQuery = true;
}
if (!HasQuery)
...{
fm = new T(); //不能这样new,提示:变量类型“T”没有 new() 约束,因此无法创建该类型的实例
fm.MdiParent = this; //也不能,提示:“T”并不包含“MdiParent”的定义
fm.Show(); //也不行,同上
}
}
// MenuItem为一个菜单,FrmAddProblem为一个窗体类,当然是由Form类继承下来的。
// 此菜单的Click事件是用于打开一个FrmAddProblem窗体,如果已经打开一个实例,则
// 将之前打开的激活,如果没有则new一个
private void MenuItem_Click( object sender, EventArgs e)
... {
ShowMdiChild<FrmAddProblem>("FrmAddProblem");
}
错误之处,请见代码的注释,不知该如何实现在模板函数中能用模板类参数来new一个类的实例。急!