2010-01-17 64 views
2

我正在構建一個自定義Web控件,其中包含一個公共屬性,我只想在設計時使用它(即使其在代碼後面不可用)。 的DesignOnly屬性承諾做到這一點,但是當我設置[DesignOnly(true)]它沒有任何明顯的效果:DesignOnly屬性不會隱藏運行時的屬性

[Bindable(true)] 
[Category("Appearance")] 
[DefaultValue(null)] 
[Localizable(false)] 
[DesignOnly(true)] 
public string MyProp 
{ 
    get 
    { 
     return ViewState["MyProp"] as string; 
    } 


    set 
    { 
     ViewState["MyProp"] = value; 
    } 
} 

仍然出現在智能感知背後的代碼性能。在代碼後面設置一個值作品。在這些方面,行爲就像屬性從未設置過一樣。我已經清理並重建了完整的解決方案。兩次。

我做錯了嗎?那麼你能告訴我什麼纔是正確的方式呢?

非常感謝提前。

回答

2

的DesignOnly屬性有望做到這一點

其實,沒有;它試圖在代碼中訪問它時清除不是可用;如果你撒謊(即聲稱某些東西是設計的,只有當它可用時),那麼你應該期望它行事不端。編譯器知道什麼是可用的,並且這個僅用於設計的屬性沒有在C#規範中定義,因此如果添加此屬性,則對編譯器沒有影響。

嘗試增加:

[EditorBrowsable(EditorBrowsableState.Never)] 

其代碼編輯器(IDE)着眼於(但使用一個單獨的程序,只有當) - 注意,這並不使用它阻止你 - 它只是隱藏它。

我相信MSDN文字試圖描述實際上上存在的代碼性能之間的差異,VS,只有假裝存在的性能;你實際上可以做各種各樣的事情來讓假的屬性出現在設計器中,正是這些假裝屬性可能被標記爲僅設計。

+0

謝謝!這很有啓發。因此,我認爲沒有辦法以一種依賴於當前模式(設計/運行時)的方式來控制屬性的實際可用性? – AviJ 2010-01-17 10:41:50

+1

您可以通過使用諸如'[Browsable(false)]'等方法讓大多數設計人員無法使用代碼屬性;您可以通過使用自定義屬性模型來創建* true *設計器屬性,但這是一個高級主題,涉及對TypeDescriptor,PropertyDescriptor,ICustomTypeDescriptor,TypeConverter等的理解 - 非常複雜。 – 2010-01-17 10:54:35