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

我正在编写一个方法来进行智能类型转换 – 如果类型参数恰好是一个字符串,则使用ToString(),否则转换,但如果转换不起作用则返回null。 基本上可以获得尽可能多的信息,而不会抛出exception。

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

 Cannot convert type 'string' to 'T' 

这是我的方法:

 public T? Convert(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; } } 

如果这是某种不可饶恕的罪,请告诉我。 我用它来处理一些可能有混合类型的数据结构。

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

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

 return (T)(object) v; 

我会使用is而不是捕获InvalidCastException

有关为何需要这些内容的详细信息,请参阅Eric Lippert最近的博客文章 。

特别是:

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

(用U代替T ,用bool代替string ……)

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

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

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

 return (T)(object)v; 
 using System.ComponentModel; 

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

警告,如果T与v中包含的对象之间不存在转换,则会抛出exception。