[英]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.