我正在尝试将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;在我正在研究的机器上...但我还是希望这项工作......
答案 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);
}