在运行时,我收到以下错误
"对象必须实现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">
错误输出我用//错误
标记的地方答案 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);
}