C#帮我一些Generic cast awesomeness

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)

那么,我最好的选择是什么?如果有人可以给我一个可行的方法,我可以从那里拿走它.

SLa*_*aks 6

Convert.ChangeType应处理边缘案件; 它委托给IConvertible.

要回答这个问题,编译器不知道那T是什么string.
因此,它不允许你在不相关的类型之间进行转换(就像你不能转换ButtonTextBox).

您可以通过转换到object第一个来解决这个问题:

return (T)(object)o.ToString();
Run Code Online (Sandbox Code Playgroud)

现在,编译器允许每个单独的转换(它是直接向上转换或直接向下转换),并且您知道整个事情将起作用,因为TString.