在上一篇文章中,我們為自定義控件添加了一個複雜屬性 Scope,並為其編寫了對應的類型轉換器。本文將詳細剖析該類型轉換器的核心代碼,解釋每個關鍵方法的作用與實現邏輯,幫助您掌握 WinForm 控件屬性類型轉換的核心機制。
要實現一個完整的類型轉換器,必須重寫 TypeConverter 基類的以下四個虛方法:
String 和 InstanceDescriptor 兩種類型的轉換。ConvertTo 方法負責將 Scope 物件轉換為設計器所需的表示形式,主要處理兩種目標類型:
if (destinationType == typeof(String)) {
Scope scope = (Scope)value;
result = scope.Min.ToString() + "," + scope.Max.ToString();
return result;
}
當目標類型為 String 時,將 Scope 的 Min 和 Max 兩個整數屬性以逗號分隔拼接為字串(如 "10,200"),這正是屬性瀏覽器中呈現給使用者的格式:

if (destinationType == typeof(InstanceDescriptor)) {
ConstructorInfo ci = typeof(Scope).GetConstructor(
new Type[] { typeof(Int32), typeof(Int32) });
Scope scope = (Scope)value;
return new InstanceDescriptor(ci, new object[] { scope.Min, scope.Max });
}
此處利用反射獲取 Scope(Int32, Int32) 建構函式的 ConstructorInfo,並構建 InstanceDescriptor。設計器據此生成如下初始化代碼:
this.myListControl1.Scope = new CustomControlSample.Scope(10, 200);
最後別忘了調用 base.ConvertTo(...),將不支援的類型交由基類處理。
ConvertFrom 專注於將使用者在屬性瀏覽器輸入的字串解析為 Scope 物件:
public override object ConvertFrom(ITypeDescriptorContext context,
CultureInfo culture, object value) {
if (value is string) {
String[] v = ((String)value).Split(',');
if (v.Length != 2) {
throw new ArgumentException("Invalid parameter format");
}
Scope csf = new Scope();
csf.Min = Convert.ToInt32(v[0]);
csf.Max = Convert.ToInt32(v[1]);
return csf;
}
return base.ConvertFrom(context, culture, value);
}
核心邏輯:
"10200" 缺少逗號)。Int32 並賦值給新建的 Scope 實例。InstanceDescriptor 轉換)。透過重寫這四個核心方法,ScopeConverter 實現了:
"Min,Max" 友好顯示這就是 WinForm 控件屬性類型轉換器的完整實現邏輯,掌握後即可為任意自訂類型提供豐富的設計時體驗。