At runtime I get the following error
"Object must implement IConvertible"
calling function
lboxBuildingType.SelectedIndex = pharse.returning<int>xdoc.Root.Element("BuildingTypeIndex").Value);
public static T returning<T>(object o)
{
       Tuple<bool, T, object> tmp;
       switch (Type.GetTypeCode(typeof(T)))
       {
        ////blah blah blah
           case TypeCode.Int32:
              tmp= (Tuple<bool,T,object>)Convert.ChangeType(I(o.ToString())), typeof(T)); // error
              break;
        ////blah blah blah
       }
}
private static Tuple<bool, Int32, Object> I(object o)
{
      int i;
      bool b;
      Int32.TryParse(o.ToString(), out i);
      b = (i == 0);
      return new Tuple<bool, Int32, object>(b, i, o);
}
The aim of the code is to pass in a <T>("15") and have it produce a tuple<Bool,T,object> which would be tuple<true, 15, "15">
It errors out where I have marked it with a // error
ConvertType is a method that lets you convert objects implementing IConvertable into one of a fixed set of objects (strings, numeric types, etc.)  Not only is it not able to convert any IConvertible object into any type of Tuple (If you look at the methods of that interface you'll see why.) but the Tuple that you're calling it on isn't IConvertible as the error message is telling you.  
Of course, the solution is to just not call ChangeType in the first place.  It exists to convert objects from one type to another, but the object you have is already of the proper type, you just need to inform the compiler that the compile time expression should be different, and that you know that the type will always match at runtime.  You do this with just a regular cast:
tmp = (Tuple<bool,T,object>) (object) I(o.ToString());
                        Try This. This ignores "Object must implement IConvertible" error for example GUID:
public object ChangeType(object value, Type type)
    {
        if (value == null && type.IsGenericType) return Activator.CreateInstance(type);
        if (value == null) return null;
        if (type == value.GetType()) return value;
        if (type.IsEnum)
        {
            if (value is string)
                return Enum.Parse(type, value as string);
            else
                return Enum.ToObject(type, value);
        }
        if (!type.IsInterface && type.IsGenericType)
        {
            Type innerType = type.GetGenericArguments()[0];
            object innerValue = ChangeType(value, innerType);
            return Activator.CreateInstance(type, new object[] { innerValue });
        }
        if (value is string && type == typeof(Guid)) return new Guid(value as string);
        if (value is string && type == typeof(Version)) return new Version(value as string);
        if (!(value is IConvertible)) return value;
        return Convert.ChangeType(value, type);
    } 
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With