在c#中限制使用泛型创建子窗体
本文关键字:泛型 创建 窗体 | 更新日期: 2023-09-27 18:11:58
经过测试,我提出了以下解决方案,以避免(从MdiParent表单)创建多个子表单实例。
对于第一个表单,代码是:public CatForm MyCatForm {
get {
var myCatForms =
MdiChildren.Where(form => form.GetType() == typeof(CatForm));
if (myCatForms.Count() > 0)
return (CatForm)myCatForms.First();
return new CatForm { MdiParent = this };
}
}
到目前为止都很好,现在我要开始重复自己与其他儿童形式(请把单词猫改为狗,羊),你会知道我的意思。
谁能写一段类似的代码:
private Form GetForm<T>(T form){
var myForms = MdiChildren.Where(aForm => aForm.GetType() == typeof(T));
if (myForms.Count() > 0)
return myForms.First();
return new (typeof(T) as Form) { MdiParent = this } ;
}
似乎c#在编译时无法确定返回类型:(
在这种情况下,反射是一种合适的方法吗?
我希望能够创建任何子窗体的唯一实例。
Thanks in advance
您需要对此进行约束:
private Form GetForm<T>(T form) where T: Form, new()
{
var myForms = MdiChildren.Where(aForm => aForm.GetType() == typeof(T));
if (myForms.Any())
return myForms.First();
return new T() { MdiParent = this } ;
}
这将方法限制为只使用Form
类型(允许您设置MdiParent
),并使用new()
约束使构造函数工作。
如果你喜欢在线阅读,试试这个:
private Form GetForm<T>(T form) where T: Form, new()
{
return MdiChildren.OfType<T>().SingleOrDefault()
?? new T() { MdiParent = this };
}
OfType LINQ运算符的作用与Where(e => e is T)相同。