7

我正在编写一种方法来进行智能类型转换 - 如果类型参数恰好是字符串,则使用 ToString() ,否则进行转换,但如果转换不起作用则返回 null 。v基本上可以在不引发异常的情况下从中获取尽可能多的信息。

在我尝试演员之前,我检查了这T确实是一个string,但编译器仍然不是粉丝:

Cannot convert type 'string' to 'T'

这是我的方法:

public T? Convert<T>(object v)
{
    if (typeof(T) == typeof(string)) {
    return (T)v.ToString(); // Cannot convert type 'string' to 'T'  
    } else try {
      return (T)v;
    } catch (InvalidCastException) {
    return null;
    }
}

也让我知道这是否是某种不可饶恕的罪过。我正在使用它来处理一些可能具有混合类型的数据结构。

4

4 回答 4

28

object转换为泛型类型时,您基本上需要通过:

return (T)(object) v.ToString()

return (T)(object) v;

我会使用is而不是捕捉InvalidCastException

请参阅Eric Lippert 最近的博客文章,了解为什么这是必要的更多详细信息。

尤其:

因为编译器知道这种转换可能成功的唯一方法是 ifU是 bool,但U可以是任何东西!编译器假定大部分时间U不会用 构造bool,因此这段代码几乎肯定是一个错误,编译器会提醒您注意这一事实。

(代替T和代替U... )stringbool

于 2012-08-08T14:07:22.217 回答
3

你需要转换你的字符串,object因为你的返回类型是通用的,即

return (T)(object)v.ToString();
于 2012-08-08T14:07:13.907 回答
0

object在转换为之前尝试转换为T

return (T)(object)v; 
于 2012-08-08T14:08:45.593 回答
0
using System.ComponentModel;

...

public T Convert<T>(object v) {
    return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(v);
}

警告,如果 T 和 v 中包含的对象之间不存在转换,这将引发异常。

于 2012-08-08T17:23:54.953 回答