我正在尝试将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传递一些参数,这似乎是Doubles和DateTimes特别需要的。
问题是在我正在创建的系统中,我不确定将字符串解析为哪种类型,因此这就是我使用泛型的原因。
我该如何进行这项工作?
例子
解析双重的单元测试:
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.
我认为这是因为我应该在正在使用的计算机上使用“ 2040,345434” ...但是无论如何我都希望它能正常工作...
如果您希望能够进行转换,则可以使用以下方法。
public T ConvertToType<T>(string input)
{
return (T)Convert.ChangeType(input, typeof(T));
}
用法:
string input = "06/23/2016";
DateTime date = ConvertToType<DateTime>(input);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句