将字符串解析为泛型类型

时间:2016-06-23 19:18:59

标签: c#

我正在尝试将String转换为泛型类型,例如:

Int16, Int32, Int64, Double, Boolean, DateTime, Guid, ...

我创建了以下内容,适用于Ints和Booleans:

public static Boolean TryParse<T>(String source, out T value) {

  TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));

  try {

    value = (T)converter.ConvertFromString(source);
    return true;

  } catch {

    value = default(T);
    return false;

  }

}

然而,它不适用于双打,日期......

在不使用通用TryParse的情况下,我能够使其工作:

  List<String> values = new List<String> { "1", "true", "2.125", "C", "20-08-2016" };

  List<Object> parsed = new List<Object>();

  foreach (String value in values) {

    Int32 i;
    Boolean b;
    Double d;
    DateTime dt;

    if (Int32.TryParse(value,NumberStyles.Integer, CultureInfo.InvariantCulture, out i)) {
      parsed.Add(i);
    } else if (Boolean.TryParse(value, out b)) {
      parsed.Add(b);
    } else if (Double.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out d)) {
      parsed.Add(d);
    } else if (DateTime.TryParse(value, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out dt)) {
      parsed.Add(dt);
    } else {
      String s = value;
      parsed.Add(s);
    }

  }

但正如您所看到的,我正在向每个TryParse传递一些参数,这些参数似乎特别需要双打和日期时间。

问题是在我创建的系统中我不确定我将解析字符串的类型,所以这就是我使用Generics的原因。

我该如何做到这一点?

示例

解析双精度的单元测试:

public void TryParse_ParseStringToDouble() {

  Double result;

  StringExtensions.TryParse("2040.345434", out result);

  Assert.Equal(result, 2040.345434);

}

有了这个,我在TryParse上得到了一个例外:

2040.345434 is not a valid value for Double.

我认为这是因为我应该使用&#34; 2040,345434&#34;在我正在研究的机器上...但我还是希望这项工作......

2 个答案:

答案 0 :(得分:1)

如果您希望能够转换,可以使用以下方法。

public T ConvertToType<T>(string input)
{
    return (T)Convert.ChangeType(input, typeof(T));
}

用法:

string input = "06/23/2016";
DateTime date = ConvertToType<DateTime>(input);

答案 1 :(得分:0)

与Matt Rowland相同,但处理无效。

 public static T ConvertToType<T>(object value)
 {
      var targetType = typeof(T);
      var conversionType = Nullable.GetUnderlyingType(targetType) ?? targetType;
      return (T)Convert.ChangeType(value, conversionType);
  }