[英]C# generics usercontrol
我想定義以下控件:
public partial class ObjectSelectorControl<T> : UserControl where T : class
問題是設計人員無法解決此問題。 有沒有解決此問題的方法?
這有效
public class Control1<T> : UserControl { ... }
public class Control2 : Control1<double> { ... }
public class Control3 : Control2 { ... }
在這里閱讀過:
聽起來很像我們在項目中所做的。
有一個通用的基類:
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
{
...
}
為了能夠使用設計器,控件可以執行或不能執行的操作受到一些限制。 從根本上講,它們都圍繞能夠實例化您的類的設計器而展開(必須具有無參數構造函數,不能是abstract
,等等)。 因為設計人員不知道將什么類型作為通用參數傳遞(我懷疑這甚至是一個考慮),所以無法實例化您的類。
您最大的希望是創建UserControl
並將構造函數更改為protected
(我相信這會起作用,因為設計人員使用反射並忽略可見性,但我不是100%積極的)。 然后,您可以從該UserControl
繼承並創建您的通用類,然后調用基( protected
)構造函數。
我認為這是不可能的,因為設計器會調用您的類的實例。 如果使用泛型,設計人員將不知道將哪種類型傳遞給“ T”。
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=105876
該錯誤已發布到Microsoft的站點,您可以看到其標記為“推遲”,目前尚無解決方案! 。
使用組合代替泛型。 不要使用ObjectSelectorControl,而是使用另一種類型的通用成員(可能是Selector<T>
)並對該對象執行操作,而不是試圖強迫自己成為通用對象。
我不知道在哪一點(使用哪個C#/。NET / VS版本更新),但是現在可以像創建任何其他通用類一樣創建通用控件。
如果您以VS的標准方式創建UserControl
(即通過GUI添加),則只需在類聲明的兩個部分(“基本”類代碼和設計器托管文件)中添加<T>
即可。 實際上,這就是引用代碼中的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.