我正在尝试编写一种方法,用于将给定对象转换为给定类型的实例。我从这开始:
private static T TryCast<T>(object o)
{
return (T) o;
}
进入,我知道 不会起作用,但它说明了这个概念。现在,当我的类型不能自动转换时,我将开始遇到问题,比如string - &gt;约会时间。我试图使用转换类来处理这些情况,但我只是得到编译时错误而不是运行时错误。以下代码获取编译错误“无法将类型'string'的表达式转换为类型'T'
private static T TryCast<T>(object o)
{
var typeName = typeof (T).FullName;
switch (typeName)
{
case "System.String":
return (T) Convert.ToString(o);
default:
return (T) o;
}
}
我也知道Convert.ChangeType(),但我想知道它是否会处理我在上面的开关中处理的边缘情况,比如声明的字符串 - &gt;我通常只使用Convert.ToDateTime for。
的DateTimeprivate static T TryCast<T>(object o)
{
return (T)Convert.ChangeType(o, typeof(T));
}
那么,我最好的选择是什么?如果有人可以给我一个可行的方法,我可以从那里接受它。
答案 0 :(得分:6)
Convert.ChangeType
应处理边缘情况;它委托给IConvertible
。
要回答这个问题,编译器不知道T
是string
因此,它不允许您在不相关的类型之间进行转换(就像您无法将Button
转换为TextBox
)。
您可以先转换为object
来解决这个问题:
return (T)(object)o.ToString();
现在,编译器允许每个单独的转换(它是直接向上转换或直接向下转换),并且您知道整个事情将起作用,因为T
是String
。