2012-03-01 41 views
5

我想写一个方法将给定的对象转换为给定类型的实例。我开始与此:C#帮我一些泛型铸造迷人

private static T TryCast<T>(object o) 
{ 
    return (T) o; 
} 

进去,我知道那不会工作,但它说明了这一概念。现在,当我有不会自动投射的类型时,我会开始遇到问题,如字符串 - > DateTime。我试图使用Convert类来处理这些情况,但我只是得到一个编译时错误而不是运行时错误。以下代码获取编译错误“无法投型‘字符串’的表达式类型‘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()的,但我不知道它是否会在处理边缘我会以其他方式处理在上述开关,就像规定字符串的情况下 - >日期时间,我会通常只使用Convert.ToDateTime为

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

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

+0

好的,为了给出一个上下文,此方法的直接用法是从DataRow对象的列值中动态分配类型为T的实例的属性。我会传入Dictionary 其中Key =实例上的属性名称,以及Value = DatRow上的列名称。我已经写了反射来从类型中获取PropertyInfos并设置实例值。这个铸造位是我最后一块拼图。我希望它尽可能重复使用,但是如果将范围限制在我的示例中使其更容易,那就这样做吧。 – 2012-03-01 16:15:17

+0

我知道上面的第二个例子应该生成编译器错误,以及为什么。我只是用它来说明方法,谢谢。不是新的:<) – 2012-03-01 16:26:09

回答

6

Convert.ChangeType应该处理边缘情况;它代表IConvertible

要回答这个问题,编译器不知道Tstring
因此,它不会让你在不相关的类型之间进行投射(就像你无法投射ButtonTextBox)。

可以解决,通过铸造object第一:

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

现在,每个单独的转换是由编译器(它要么直接向上转型或直接沮丧的)允许,你知道,整个事情将起作用,因为TString

+0

为什么赫克没有想到这个?让我们看看其他人都说了些什么,但这可能是被接受的答案。 – 2012-03-01 16:20:56