2009-10-20 67 views
4

我有一個類被聲明爲:複雜類聲明混淆表單設計器?


public class Foo<T> : Panel where T : Control, IFooNode , new() 
{ 
    ... 
} 

我說這手工測試,但我最終將需要的東西,可以顯示在窗體設計器。窗體設計器不喜歡這一點,它說:

 
Could not find type 'FooTestNameSpace.Foo'. 
Please make sure that the assembly that 
contains this type is referenced. 
If this type is a part of your development project, make 
sure that the project has been successfully built. 

有趣的是,我也得到一個警告類似,但包括我在變量的聲明中使用的通用類型。 警告是:

Could not find type 'FooTestNameSpace.Foo<FooTestNameSpace.FooNodeType>'. 
Please make sure that the assembly that contains this type is referenced. 
If this type is a part of your development project, 
make sure that the project has been successfully built.

在我簡單的Form1類的聲明是:

private FooTestNameSpace.Foo myFoo;

(FooNodeType實際上只是一個還沒有被使用一個輔助屬性標籤的子類,但它確實實現IFooNode )。

所以我的問題......有了這種類型的設置,我怎樣才能讓Foo在窗體設計器上顯示,或者至少讓它承認Foo是合法的?有沒有可以處理這個問題的Designer屬性?我真的不在乎Foo控件是否顯示爲空框,只要它完全顯示!

+2

設計人員很適合簡單的拖放操作。對於更復雜的班級簽名,您可能會期待太多。 – 2009-10-20 03:00:27

+0

如果您還準確地解釋了您想要使用該視圖類來完成的任務,並且可能會顯示更多代碼,那可能會更有幫助。您完全有可能錯過了使用聲明,但無法從您的摘錄中看出來。 – 2009-10-20 03:14:55

回答

7

好吧,我想我有一個解決辦法:



class ConcreteFooCtl : FooCtl<FooNodeType> 
{ 
} 

class FooCtl<T> : Panel where T : Control, IFooNode , new() 
{ 
} 

這個問題似乎是與窗體設計器無法處理任何通用的控制。 表單設計人員無法處理FooCtl,但與ConcreteFooCtl沒有問題。 不是一個理想的解決方案,但我認爲它至少可行。也許VS的下一個版本將提示用戶在向表單添加通用控件時指定一個通用類型...;)

+1

這是解決這個問題的正確方案。自從一年前以來,我遇到了同樣的問題,但還沒有找到任何其他解決方案。 – 2009-10-20 03:36:16

1

而不是讓Foo成爲泛型,你可能會更好地使它成爲非泛型的,並讓它包含一個能夠滿足你需要的泛型類。然後,您可以將所有處理從表單委託給該類。