2

经过一番测试,我想出了以下解决方案,以避免(从 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 };
    }
}

到目前为止一切顺利,现在我将开始用其他儿童形式重复自己(请将单词 Cat 更改为 Dog,Sheep),您会明白我的意思。

有人可以写一段代码,类似于:

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# 无法确定返回类型:(

在这种情况下,反思会是一种合适的方法吗?

我希望能够创建任何子窗体的唯一实例。

提前致谢

4

2 回答 2

4

您需要对此进行限制:

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()约束以使构造函数起作用。

于 2013-05-02T02:41:44.850 回答
1

如果你喜欢oneliners,试试这个:

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

于 2013-05-02T09:41:40.183 回答