c# how to implement type converter

后端 未结 2 540
旧巷少年郎
旧巷少年郎 2020-12-31 20:35

I am struggling to implement a simple Type converter in C#. I followed this guide https://msdn.microsoft.com/en-us/library/ayybcxe5.aspx

Here is my class :

相关标签:
2条回答
  • 2020-12-31 21:00

    The code provided is a bit mixed up and it's missing some important stuff. Following, an implementation that converts a custom class CrazyClass from and to string.

    CrazyClassTypeConverter

    public class CrazyClassTypeConverter : TypeConverter
    {
        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
        {
            return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType);
        }
    
        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            var casted = value as string;
            return casted != null
                ? new CrazyClass(casted.ToCharArray())
                : base.ConvertFrom(context, culture, value);
        }
        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
        {
            var casted = value as CrazyClass;
            return destinationType == typeof (string) && casted != null
                ? String.Join("", casted.Charray)
                : base.ConvertTo(context, culture, value, destinationType);
        }
    }
    

    CrazyClass

    (note that the class is decorated with TypeConverterAttribute)

    [TypeConverter(typeof(CrazyClassTypeConverter))]
    public class CrazyClass
    {
        public char[] Charray { get; }
    
        public CrazyClass(char[] charray)
        {
            Charray = charray;
        }
    }
    

    Usage

    var crazyClass = new CrazyClass(new [] {'T', 'e', 's', 't'});
    var converter = TypeDescriptor.GetConverter(typeof(CrazyClass));
    
    //this should provide you the string "Test"        
    var crazyClassToString = converter.ConvertToString(crazyClass); 
    
    //provides you an instance of CrazyClass with property Charray set to {'W', 'h', 'a', 't' } 
    var stringToCrazyClass = converter.ConvertFrom("What"); 
    
    0 讨论(0)
  • 2020-12-31 21:15

    You have to attach this converter to a class with the TypeConverter attribute.
    TypeDescriptor.GetConverter Get the attached converter of the class.

    You better split the classes:

    [TypeConverter(typeof (TestClassConverter))]
    public class TestClass
    {
        public string Property1 { get; set; }
        public int Property2 { get; set; }
        public TestClass(string p1, int p2)
        {
            Property1 = p1;
            Property2 = p2;
        }
    }
    
    [TypeConverter(typeof (TestClassConverter))]
    public class TestClassConverter : TypeConverter
    {
        public override bool CanConvertFrom(ITypeDescriptorContext context,
        Type sourceType)
        {
            if (sourceType == typeof(string))
            {
                return true;
            }
            return base.CanConvertFrom(context, sourceType);
        }
        public override object ConvertFrom(ITypeDescriptorContext context,
         CultureInfo culture, object value)
        {
            if (value is string)
            {
                return new TestClass("", Int32.Parse(value.ToString()));
            }
            return base.ConvertFrom(context, culture, value);
        }
        public override object ConvertTo(ITypeDescriptorContext context,
        CultureInfo culture, object value, Type destinationType)
        {
            if (destinationType == typeof(string)) { return "___"; }
            return base.ConvertTo(context, culture, value, destinationType);
        }
    }
    
    0 讨论(0)
提交回复
热议问题