我想定義以下控制:C#泛型用戶控件
public partial class ObjectSelectorControl<T> : UserControl where T : class
的問題是,設計者無法解決這個問題。有沒有解決這個問題的方法?
我想定義以下控制:C#泛型用戶控件
public partial class ObjectSelectorControl<T> : UserControl where T : class
的問題是,設計者無法解決這個問題。有沒有解決這個問題的方法?
這工作
public class Control1<T> : UserControl { ... } public class Control2 : Control1<double> { ... } public class Control3 : Control2 { ... }
曾在這裏閱讀:
http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/0c265543-d6f0-41f6-beeb-b89e0071c5c3
爲了能夠使用設計器,您的控件可以或不可以做什麼有一些限制。從根本上講,它們都圍繞着設計者能夠實例化你的類(必須有一個無參數的構造函數,不能是abstract
等)。因爲設計者不知道什麼類型可以作爲一個通用參數傳遞(我懷疑這甚至是一個考慮因素),所以你的類不能被實例化。 (我相信,這將會起作用,因爲設計師使用反射並忽略可見度,但我不是100%正面的)。您最好的希望是創建UserControl
並將構造函數更改爲protected
。然後,您可以繼承UserControl
並創建泛型類並調用基礎(protected
)構造函數。
我不相信這是可能的,因爲設計者調用你的類的一個實例。如果你使用泛型,設計者不知道傳入'T'的類型。
聽起來很像我們在我們的項目中做的。
有一個基類是通用的:
public partial class controlItemList<TBaseItem, TBaseItemCollection> : UserControl, IUIDispatcher
where TBaseItem : new()
where TBaseItemCollection : IItemCollection<TBaseItem>
然後每次使用我們定義了一個非通用版本(這仍然無法設計者使用):
public class controlMessagesNonGenericParent : controlItemList<MailItem, MailItemCollection>
{
}
。 ..然後我們派生出可用於設計者的控件:
public partial class controlMessages : controlMessagesNonGenericParent
{
...
}
儘管如此,你似乎正走向相反的方向。你有一個通用的基礎,你正在爲設計者創建具體的具體實現。這聽起來像他想創建一個通用控件並設計它。 –
你是對的,但直接使用泛型類作爲控件是不可能的。這就是爲什麼我們將它分類的原因,所以它可以在設計器中使用。子類版本修改行爲的事實在這裏並不重要。 –
對,這是不可能的,但它似乎沒有解決他的問題。這不是一種「黑客」,可以讓他解決問題。事實上,解決方案似乎是沿着其他方向發展(創建一個不通用的控件,進行設計,然後對其進行子類化並使其通用)更有意義。我不明白這是如何解決任何事情。 –
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=105876
該錯誤已發佈到微軟的網站,你可以看到它的標記爲「推遲」目前沒有解決方案! 。
看起來並不像一個「bug」,這是使用泛型的結果。也許他們可以提供未來的增強功能,允許您選擇要提供的類型,但我不會將其歸類爲「錯誤」。 –
使用組合而不是泛型。而不是使用ObjectSelectorControl,給一個另一種類型的通用成員(Selector<T>
也許),並對該對象採取行動,而不是試圖強制自己是通用的。
也許我錯了,但是如果你在你的UserControl中使用組合:a)你必須指定通用屬性的類型,或者b)你必須讓你的類通用,所以我不明白你的意思。 –
構圖不是泛型的替代技術。也許可以設計一個解決方案來讓WinForms與泛型一起工作,涉及到構圖,但在這種情況下,您的答案並不表示任何方向。 – MarioDS
當你試過,你怎麼會在聲明XAML類? –