在尝试返回元组时,对象必须实现IConvertible

时间:2015-10-19 14:06:10

标签: c#

在运行时,我收到以下错误

  

"对象必须实现IConvertible"

调用函数

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);
}

代码的目的是传入<T>("15")并生成tuple<Bool,T,object> tuple<true, 15, "15">

错误输出我用//错误

标记的地方

2 个答案:

答案 0 :(得分:4)

ConvertType是一种方法,可以将实现IConvertable的对象转换为一组固定的对象(字符串,数字类型等)。它不仅无法转换任何IConvertible 1}}对象进入任何类型的Tuple(如果你看一下那个界面的方法,你就会明白为什么。)但你调用它的Tuple不是{{1}正如错误消息告诉你的那样。

当然,解决方案是首先不要调用IConvertible。存在将对象从一种类型转换为另一种类型,但您拥有的对象已经是正确的类型,您只需要通知编译器编译时表达式应该不同,并且您知道该类型将始终在运行时匹配。你只需要定期演员就可以做到这一点:

ChangeType

答案 1 :(得分:1)

试试这个。这忽略了&#34;对象必须实现IConvertible&#34;错误,例如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);
    }