類型轉換器負責將設計時的字串屬性值轉換為執行期的強型別物件,反之亦然。ASP.NET 頁面剖析器自動套用標註 [TypeConverter(typeof(MyConverter))] 的屬性。
| 類型 | 用途 | 核心方法 |
|---|---|---|
| 值轉換 | 字串 ⇄ 複雜型別 (如 Point、Color、Unit) | CanConvertFrom/To、ConvertFrom/To |
| 標準值列表 | 屬性視窗下拉選單 (如列舉、預設尺寸) | GetStandardValuesSupported、GetStandardValues |
| 設計時代碼產生 | 產生建構函式初始化碼 (如 new Point(10,20)) | GetCreateInstanceSupported、CreateInstance |
public class PointConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext ctx, Type srcType)
=> srcType == typeof(string) || base.CanConvertFrom(ctx, srcType);
public override object ConvertFrom(ITypeDescriptorContext ctx, CultureInfo ci, object val)
{
if (val is string s)
{
string[] parts = s.Split(',');
return new Point(int.Parse(parts[0]), int.Parse(parts[1]));
}
return base.ConvertFrom(ctx, ci, val);
}
public override object ConvertTo(ITypeDescriptorContext ctx, CultureInfo ci, object val, Type destType)
{
if (destType == typeof(string) && val is Point p)
return $"{p.X},{p.Y}";
return base.ConvertTo(ctx, ci, val, destType);
}
}
// 套用至屬性
[TypeConverter(typeof(PointConverter))]
public Point Location { get; set; }
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext ctx)
=> new StandardValuesCollection(new[] { "Small", "Medium", "Large" });
public override bool GetStandardValuesSupported(ITypeDescriptorContext ctx) => true;
public override bool GetStandardValuesExclusive(ITypeDescriptorContext ctx) => true; // 僅限列表值
善用 TypeConverter 讓自訂控制項屬性在設計工具中擁有原生控制項級的編輯體驗。