前文介紹了常用設計時屬性(Browsable、Category、Description 等),雖然簡單但對使用者體驗至關重要。本文重點深入兩個進階屬性:DesignerSerializationVisibilityAttribute 與 TypeConverterAttribute。
此屬性指示代碼生成器如何持久化屬性值,取值為枚舉 DesignerSerializationVisibility:
Add 呼叫),而非物件本身。建立一個簡單的 MyListControl,包含整數集合屬性 Item:
public class MyListControl : Control {
private List<Int32> _list = new List<Int32>();
[Browsable(true)]
public List<Int32> Item {
get { return _list; }
set { _list = value; }
}
// OnPaint 繪製邊框與列表項目...
}
預設情況下,設計器將集合內容序列化至資源檔(.resx):
this.myListControl1.Item = ((List<int>)(resources.GetObject("myListControl1.Item")));
[Browsable(true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<Int32> Item { ... }
重新建置、重新添加集合項目後,設計器生成代碼變為:
this.myListControl1.Item.Add(1);
this.myListControl1.Item.Add(2);
this.myListControl1.Item.Add(3);
this.myListControl1.Item.Add(6);
this.myListControl1.Item.Add(8);
this.myListControl1.Item.Add(9);
集合內容現直接以 Add 方法呼叫形式寫入 InitializeComponent,實現了源代碼級序列化。
TypeConverterAttribute 為屬性指定轉換器,核心作用:
InstanceDescriptor).NET 內建大量轉換器(ColorConverter、EnumConverter 等),自訂類型才需自行實作。

屬性瀏覽器中 Item 顯示為 Collection,點擊可彈出集合編輯器:

下一篇將詳細剖析 TypeConverterAttribute 與自訂類型轉換器的完整實作細節。