我們知道,C#中有int.Parse,int.TryParse這樣神奇的功能,那它們又是如何做到的呢?我們試着自己也來自定義一個“轉換器”。
首先,定義一個類:
public class Human { public string Name { get; set; } public Human Child { get; set; } }
這個類具有兩個屬性:
· string類型的Name
· Human類型的Child
現在,我期望為Human實例的Child屬性賦一個Human類型的值,並且Child.Name就是這個字符串的值。
我們先在Button1_Click事件中嘗試着這樣寫:
private void button1_Click(object sender, RoutedEventArgs e) { Human h = (Human)this.FindResource("human"); MessageBox.Show(h.Child.Name); }
運行后報錯,告訴Child不存在,為什么Child不存在呢?原因很簡單,Human實例的Child屬性是Human類型,而“ABC”是一個字符串,編譯器不知道如何將一個字符串實例轉換成一個Human實例。那我們應該怎么做呢?辦法是使用TypeConverter和TypeConvertAttribute這兩個類。
首先,我們要從TypeConverter中派生出自己的類,並重寫它的一個ConvertFrom方法。這個方法有一個參數名為value,我們要做的就是講這個值“翻譯”成合適的值賦給對象的屬性:
using System.ComponentModel; public class StringToHumanTypeConverter : TypeConverter { public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { if (value is string) { Human h = new Human(); h.Name = value as string; return h; } return base.ConvertFrom(context, culture, value); } }
有了這個類還不夠,還要使用TypeConverterAttribute這個特征類把StringToHumanTypeConverter這個類“粘貼”到作為目標的Human類上。
[TypeConverterAttribute(typeof(StringToHumanTypeConverter))] public class Human { public string Name { get; set; } public Human Child { get; set; } }
因為特征類在使用的時候可以省略Attribute這個詞,所以也可以寫成:
[TypeConverter(typeof(StringToHumanTypeConverter))] public class Human { public string Name { get; set; } public Human Child { get; set; } }
但這樣寫,我們需要認清寫在方括號里的是TypeConverterAttribute而不是TypeConverter。
完成之后,再單擊按鈕,想要的結果就彈出來了。
