是否有任何通用的Parse()函数将使用parse将字符串转换为任何类型?

我想根据generics返回类型将字符串转换为generics类型,如intdatelong

基本上像Parse(String)这样的函数返回类型为T的项。

例如,如果传递了一个int,那么函数应该在内部执行int.parse

System.Convert.ChangeType

根据您的示例,您可以:

 int i = (int)Convert.ChangeType("123", typeof(int)); DateTime dt = (DateTime)Convert.ChangeType("2009/12/12", typeof(DateTime)); 

要满足“通用返回类型”要求,您可以编写自己的扩展方法:

 public static T ChangeType(this object obj) { return (T)Convert.ChangeType(obj, typeof(T)); } 

这将允许您:

 int i = "123".ChangeType(); 

看起来我已经来不及回答这个post了。 但这是我的实施:

基本上,我已经为Object类创建了一个Extention方法。 它处理所有类型,即可空,类和结构。

  public static T ConvertTo(this object value) { T returnValue; if (value is T variable) returnValue = variable; else try { //Handling Nullable types ie, int?, double?, bool? .. etc if (Nullable.GetUnderlyingType(typeof(T)) != null) { TypeConverter conv = TypeDescriptor.GetConverter(typeof(T)); returnValue = (T) conv.ConvertFrom(value); } else { returnValue = (T) Convert.ChangeType(value, typeof(T)); } } catch (Exception) { returnValue = default(T); } return returnValue; } 

System.Convert.ChangeType不会转换为任何类型。 想一想以下内容:

  • 可空类型
  • 枚举
  • 指导等

使用ChangeType的这种实现可以实现这些转换。

Pranay答案的清洁版

 public static T ConvertTo(this object value) { if (value is T variable) return variable; try { //Handling Nullable types ie, int?, double?, bool? .. etc if (Nullable.GetUnderlyingType(typeof(T)) != null) { return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(value); } return (T)Convert.ChangeType(value, typeof(T)); } catch (Exception) { return default(T); } } 

.NET中有几种约定可以将一种类型的对象转换为另一种类型。

  • 如果类型实现IConvertible,则转换.ChangeType
  • 如果类型具有TypeConverterAttribute,则为TypeDescriptor.GetConverter

但是这些方法比典型的T.Parse(string)慢得多,导致装箱并且每次要转换单个值时都会涉及大量分配。

对于ValueString ,我选择使用reflection找到合适的静态解析方法,构建一个调用它的lambda表达式并缓存已编译的委托以供将来使用(请参阅此答案以获取示例)。

如果类型没有合适的解析方法,它也会回到我上面提到的方式(参见自述文件中的性能部分 )。

 var v = new ValueString("15"); // struct var i = v.As(); // Calls int.Parse.