2009-08-25 56 views
22

我想定義以下控制:C#泛型用戶控件

public partial class ObjectSelectorControl<T> : UserControl where T : class 

的問題是,設計者無法解決這個問題。有沒有解決這個問題的方法?

+1

當你試過,你怎麼會在聲明XAML類? –

回答

31

這工作

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

+2

+1與我所建議的幾乎相同的解決方案,但更清晰地描述。 –

+0

是的,它的工作原理就是我一直在尋找的。 – Toto

+0

請確保在單獨的文件中有Control3。 –

1

爲了能夠使用設計器,您的控件可以或不可以做什麼有一些限制。從根本上講,它們都圍繞着設計者能夠實例化你的類(必須有一個無參數的構造函數,不能是abstract等)。因爲設計者不知道什麼類型可以作爲一個通用參數傳遞(我懷疑這甚至是一個考慮因素),所以你的類不能被實例化。 (我相信,這將會起作用,因爲設計師使用反射並忽略可見度,但我不是100%正面的)。您最好的希望是創建UserControl並將構造函數更改爲protected。然後,您可以繼承UserControl並創建泛型類並調用基礎(protected)構造函數。

0

我不相信這是可能的,因爲設計者調用你的類的一個實例。如果你使用泛型,設計者不知道傳入'T'的類型。

8

聽起來很像我們在我們的項目中做的。

有一個基類是通用的:

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 
{ 
... 
} 
+1

儘管如此,你似乎正走向相反的方向。你有一個通用的基礎,你正在爲設計者創建具體的具體實現。這聽起來像他想創建一個通用控件並設計它。 –

+1

你是對的,但直接使用泛型類作爲控件是不可能的。這就是爲什麼我們將它分類的原因,所以它可以在設計器中使用。子類版本修改行爲的事實在這裏並不重要。 –

+1

對,這是不可能的,但它似乎沒有解決他的問題。這不是一種「黑客」,可以讓他解決問題。事實上,解決方案似乎是沿着其他方向發展(創建一個不通用的控件,進行設計,然後對其進行子類化並使其通用)更有意義。我不明白這是如何解決任何事情。 –

0

使用組合而不是泛型。而不是使用ObjectSelectorControl,給一個另一種類型的通用成員(Selector<T>也許),並對該對象採取行動,而不是試圖強制自己是通用的。

+1

也許我錯了,但是如果你在你的UserControl中使用組合:a)你必須指定通用屬性的類型,或者b)你必須讓你的類通用,所以我不明白你的意思。 –

+0

構圖不是泛型的替代技術。也許可以設計一個解決方案來讓WinForms與泛型一起工作,涉及到構圖,但在這種情況下,您的答案並不表示任何方向。 – MarioDS