簡體   English   中英

C#泛型用戶控件

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

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