我正在尝试编写一种方法,将给定对象转换为给定类型的实例。我从这个开始:
private static T TryCast<T>(object o)
{
return (T) o;
}
进去后,我知道那不会起作用,但它说明了这个概念。现在,当我有不会自动转换的类型时,我将开始遇到问题,比如字符串 --> DateTime。我试图使用 Convert Class 来处理这些情况,但我只是得到一个编译时错误而不是运行时错误。以下代码得到编译错误“无法将类型为‘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(),但我想知道它是否会处理边缘情况,否则我会在上面的开关中处理,比如规定的字符串 --> DateTime,我通常只是将 Convert.ToDateTime 用于。
private static T TryCast<T>(object o)
{
return (T)Convert.ChangeType(o, typeof(T));
}
那么,我最好的选择是什么?如果有人可以给我一个可行的方法,我可以从那里开始。
最佳答案
Convert.ChangeType
应该处理边缘情况;它委托(delegate)给 IConvertible
。
要回答这个问题,编译器不知道T
是string
。
因此,它不允许您在不相关的类型之间进行转换(就像您不能将 Button
转换为 TextBox
一样)。
您可以通过首先转换为 object
来解决这个问题:
return (T)(object)o.ToString();
现在,编译器允许每个单独的转换(它要么是直接向上转换,要么是直接向下转换),并且您知道整个事情都会起作用,因为 T
是 String
.
关于C# 帮助我进行一些通用的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9519723/