首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WinForm 控件開發總結(六):深入解析控件屬性類型轉換器代碼實現

     編輯:關於.NET

前言

在上一篇文章中,我們為自定義控件添加了一個複雜屬性 Scope,並為其編寫了對應的類型轉換器。本文將詳細剖析該類型轉換器的核心代碼,解釋每個關鍵方法的作用與實現邏輯,幫助您掌握 WinForm 控件屬性類型轉換的核心機制。

類型轉換器的四大核心方法

要實現一個完整的類型轉換器,必須重寫 TypeConverter 基類的以下四個虛方法:

  • CanConvertFrom():判斷是否支援從指定來源類型轉換至目標類型。本例中僅支援 String 和 InstanceDescriptor 兩種類型的轉換。
  • CanConvertTo():判斷目標類型是否可轉換為指定的目標類型。
  • ConvertTo():將當前值轉換為指定的目標類型。
  • ConvertFrom():將輸入值轉換為目標類型的實例並返回。

ConvertTo 方法深度解析

ConvertTo 方法負責將 Scope 物件轉換為設計器所需的表示形式,主要處理兩種目標類型:

1. 轉換為字串(屬性瀏覽器顯示用)

if (destinationType == typeof(String)) {
    Scope scope = (Scope)value;
    result = scope.Min.ToString() + "," + scope.Max.ToString();
    return result;
}

當目標類型為 String 時,將 Scope 的 Min 和 Max 兩個整數屬性以逗號分隔拼接為字串(如 "10,200"),這正是屬性瀏覽器中呈現給使用者的格式:

屬性瀏覽器中的 Scope 顯示效果

2. 轉換為 InstanceDescriptor(設計時代碼生成用)

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 方法實現細節

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);
}

核心邏輯:

  1. 以逗號分割字串,若分割結果非兩段則拋出異常,提示使用者格式錯誤(如輸入 "10200" 缺少逗號)。
  2. 將兩段字串轉為 Int32 並賦值給新建的 Scope 實例。
  3. 若輸入非字串類型,交由基類處理(系統內建支援 InstanceDescriptor 轉換)。

總結

透過重寫這四個核心方法,ScopeConverter 實現了:

  • 屬性瀏覽器中以 "Min,Max" 友好顯示
  • 使用者可直接編輯字串並自動驗證格式
  • 設計器自動生成正確的實例化代碼,實現屬性值的持久化

這就是 WinForm 控件屬性類型轉換器的完整實現邏輯,掌握後即可為任意自訂類型提供豐富的設計時體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved