TypeConverter的使用


  我們知道,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。

  完成之后,再單擊按鈕,想要的結果就彈出來了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM