簡體   English   中英

限制在C#中使用泛型創建子窗體

[英]Restrict creation of children forms using generics in C#

經過一番測試之后,我想出了以下解決方案,以避免(從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#在編譯時無法確定返回的類型:(

在這種情況下,反思會是正確的做法嗎?

我希望能夠創建任何子窗體的唯一實例。

提前致謝

您需要對此進行約束:

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()約束,因此構造函數起作用。

如果您喜歡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為T)相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM