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

时间:2010-08-17 12:44:25

标签: c# string parsing type-conversion

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

基本上是像Parse<T>(String)这样的函数,它返回T类型的项。

例如,如果传递了int,则函数应在内部执行int.parse

5 个答案:

答案 0 :(得分:105)

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<T>(this object obj)
{
    return (T)Convert.ChangeType(obj, typeof(T));
}

这样你就可以:

int i = "123".ChangeType<int>();

答案 1 :(得分:14)

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

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

 public static T ConvertTo<T>(this object value)
           {
               T returnValue;

               if (value is T variable)
                   returnValue = variable;
               else
                   try
                   {
                       //Handling Nullable types i.e, 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;
           }

答案 2 :(得分:10)

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

  • 可空类型
  • 枚举
  • Guid等。

this implementation of ChangeType可以进行这些转换。

答案 3 :(得分:5)

Pranay's answer的更干净版本

public static T ConvertTo<T>(this object value)
{
    if (value is T variable) return variable;

    try
    {
        //Handling Nullable types i.e, 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);
    }
}

答案 4 :(得分:0)

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

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

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

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

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