2012-04-18 77 views
3

我有一個基類通用表格和VS設計師

internal partial class View<T> : UserControl 
    where T : class 
{ 
    protected T t; 
} 

,我想從查看

internal partial class ViewChild<T> : View<T> 
    where T : class 
{ 
} 

它的工作原理確定得到一個孩子,但我不能在VS設計師編輯ViewChild。我知道這個問題是泛型基類。但是我不明白我在這種情況下如何避免這種情況。 有什麼辦法解決這個問題嗎?

回答

2

泛型破壞設計器,因爲它不能在沒有類型T的情況下實例化類。我在我的博客文章解釋了一個解決辦法:

http://adamhouldsworth.blogspot.co.uk/2010/02/winforms-visual-inheritance-limitations.html

總之,你需要 「解決」 中間人類類型:

  • BaseControl<T> : UserControl
  • CustomerControl_Design : BaseControl<Customer>
  • CustomerControl : CustomerControl_Design

You ca N,則有條件地切換此類基於該DEBUGRELEASE編譯器開關的代碼:

#if DEBUG 

namespace MyNamespace 
{ 
    using System; 


    public partial class CustomerEditorControl_Design : BaseEditorControl<Customer> 
    { 
     public CustomerEditorControl_Design() 
      : base() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

#endif 

    public partial class CustomerEditorControl 
#if DEBUG 
     : CustomerEditorControl_Design 
#else 
     : BaseEditorControl<Customer> 
#endif 
    { 
    } 

這將讓你打開派生類的CustomerControl,不幸的是你會永遠能夠設計出用簽名中的泛型進行UI控制。我的解決方案只是啓用派生項目的設計。

我不知道爲什麼CustomerControl : BaseControl<Customer>將無法​​正常工作,因爲在這種情況下定義了類型T,但它根本沒有 - 我猜是因爲通用用法的規則。

爲了防禦,微軟確實說這不被支持。

+0

據我瞭解,這將只適用於具體的客戶類型,如果我想使用不同類型的ViewChild它將無法正常工作。我有一些基本代碼到View ,當我擴展ViewChild 一些額外的代碼,我使用視圖,ViewChild ,ViewChild 等 – wince 2012-04-18 08:18:41

+0

@wince你是對的。正如我在答案中所述,它只能解決派生形式的問題。如果你有一個實際上具有內容的通用基本表單,我建議將該想法分類並在shell表單中進行類似組合的操作。在我的使用中,基本控件只提供了邏輯,而不是視覺效果。 – 2012-04-18 08:21:10

+0

@wince你的'查看'和'ViewChild '是否也有任何視覺元素,還是隻是代碼? – 2012-04-18 08:24:12

3

還有另一種方式,它不依賴於編譯器標誌:

http://wonkitect.wordpress.com/2008/06/20/using-visual-studio-whidbey-to-design-abstract-forms/

我真的不建議使用條件編譯的。更好地使用框架,而不是反對它。

基本上,你可以通過現有的框架給VS一個不同的類。你使用TypeDescriptionProvider屬性修飾你的基類,告訴VS使用不同的類作爲設計者。

正如原始博客文章中提到的那樣,可能會有與此解決方法相關的警告,但我從工作中整齊地處理了一個項目,該項目中有大於25個用戶控件繼承自公共基類。

+0

這是一個很好的解決方案,但它沒有提到泛型。您使用它是否涵蓋泛型? – 2012-04-18 08:21:22

+0

問題域實際上是相同的,即VS託管設計類型的實例。 VS關於泛型的呻吟的原因是它不能像抽象類一樣實例化它們。在這方面,所有的泛型都是僞抽象的;沒有它們的類型參數,它們對運行時沒有意義。爲了回答你的問題,我簡單地使用泛型基類來完成強類型視圖的未完成實現(在Winforms中),但是到目前爲止,我已經停止了特定的架構轉換,轉而實現真正的功能。我可能會在本月底回到它。 – 2012-04-18 08:25:57

+0

+1如果本週末時間到了,我會嘗試用它更新我的舊代碼,看看它是否讓我設計基類 - 好找。 – 2012-04-18 08:29:52