Eri*_*ham 5 c# generics casting
我正在尝试编写一种方法,用于将给定对象转换为给定类型的实例.我从这开始:
private static T TryCast<T>(object o)
{
return (T) o;
}
Run Code Online (Sandbox Code Playgroud)
进去,我知道这不起作用,但它说明了这个概念.现在,当我的类型不能自动转换时,我将开始遇到问题,比如string - > DateTime.我试图使用转换类来处理这些情况,但我只是得到编译时错误而不是运行时错误.以下代码获取编译错误"无法将类型'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;
}
}
Run Code Online (Sandbox Code Playgroud)
我也知道Convert.ChangeType(),但我想知道它是否会处理我在上面的开关中处理的边缘情况,比如声明的字符串 - > DateTime,我通常只使用Convert. ToDateTime for.
private static T TryCast<T>(object o)
{
return (T)Convert.ChangeType(o, typeof(T));
}
Run Code Online (Sandbox Code Playgroud)
那么,我最好的选择是什么?如果有人可以给我一个可行的方法,我可以从那里拿走它.
Convert.ChangeType应处理边缘案件; 它委托给IConvertible.
要回答这个问题,编译器不知道那T是什么string.
因此,它不允许你在不相关的类型之间进行转换(就像你不能转换Button为TextBox).
您可以通过转换到object第一个来解决这个问题:
return (T)(object)o.ToString();
Run Code Online (Sandbox Code Playgroud)
现在,编译器允许每个单独的转换(它是直接向上转换或直接向下转换),并且您知道整个事情将起作用,因为T是String.