Search code examples
c#typeconverter

c# how to implement type converter


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 :

public class TestClass: TypeConverter
{
        public string Property1{ get; set; }
        public int Property2 { get; set; }
        public TestClass(string p1, int p2)
        {
            Property1= p1;
            Property2 = p2;
        }
        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);
        }
 }

I do the following TestClass ("", Int32.Parse(value.ToString())); as for now I am only interested in such case as "1231" -> new TestClass("", 1231)

And here goes the code that gives me an exception;

TypeConverter converter=TypeDescriptor.GetConverter( typeof(TestClass));
Object lalala = converter.ConvertFromString("234");

This code throws NotSupportedException but I don't get why


Solution

  • You have to attach this converter to a class with the TypeConverter attribute.
    Call TypeDescriptor.GetConverter() to 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;
        }
    }
    
    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);
        }
    }