将字符串转换为字符串的泛型类型

时间:2012-08-08 14:04:37

标签: c# string generics casting

我正在编写一个方法来进行智能类型转换 - 如果类型参数恰好是一个字符串,则使用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 个答案:

答案 0 :(得分:25)

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

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

return (T)(object) v;

我会使用is而不是抓住InvalidCastException

有关为何需要这些内容的详细信息,请参阅Eric Lippert's recent blog post

特别是:

  

因为编译器知道这种转换可能成功的唯一方法是U是bool,但U可以是任何东西!编译器假设大多数时间U不会用bool构造,因此这段代码几乎肯定是一个错误,编译器正在引起你的注意。

T替换Ustring替换bool ...

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

尝试在转换为object

之前转换为T
return (T)(object)v; 

答案 3 :(得分:0)

using System.ComponentModel;

...

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

警告,如果T与v。

中包含的对象之间不存在转换,则会引发异常
相关问题