C#帮我一些Generic cast awesomeness

时间:2012-03-01 16:11:46

标签: c# generics casting

我正在尝试编写一种方法,用于将给定对象转换为给定类型的实例。我从这开始:

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。

的DateTime
private static T TryCast<T>(object o)
{
    return (T)Convert.ChangeType(o, typeof(T));
}

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

1 个答案:

答案 0 :(得分:6)

Convert.ChangeType应处理边缘情况;它委托给IConvertible

要回答这个问题,编译器不知道Tstring 因此,它不允许您在不相关的类型之间进行转换(就像您无法将Button转换为TextBox)。

您可以先转换为object来解决这个问题:

return (T)(object)o.ToString();

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