在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

在c#中限制使用泛型创建子窗体

您需要对此进行约束:

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)相同。