我正在创建一个用于内部库的类型转换器,它应该能够从数据库返回的任何类型转换(long,DBNull,bool,string等... )任何兼容的类型。
对于可以投标的物品,这一切都有效,花花公子:
try { return (T)value } catch(InvalidCaseException) { }
或者可以解析:
请参阅Convert to a Nullable<T> from a string using Reflection
然而,当我想要这种期望的行为时,我正在撞墙:
Assert.That(
2,
Is.EqualTo(
Converter<long>.Convert("2.1")
));
问题是,当真正期望的结果是截断小数时,Pasre和TryParse函数会将其作为无效格式踢回来。
您认为使用反射将“2.1”等字符串解析为未知值类型的最佳方法是什么?
编辑:目前我正在使用:
if (Nullable.GetUnderlyingType(t) != null)
{
t = Nullable.GetUnderlyingType(t);
}
MethodInfo parse = t.GetMethod("Parse", new Type[] { typeof(string) });
if (parse != null)
{
object parsed = parse.Invoke(null, new object[] { value.ToString() });
return (T)parsed;
}
else
{
throw new InvalidOperationException("The value you specified is not a valid " + typeof(T).ToString());
}
答案 0 :(得分:4)
什么版本的.NET,以及什么范围的值?例如,一个选项是将其解析为十进制并从那里转换它......
T val = Convert.ChangeType(decimal.Parse("2.1"), typeof(T))
(上面只显示了中央转换 - 它不会尝试将其纳入您现有的代码中)
这对于巨大/非常小的值不起作用,但可能不会遇到与double
相同的舍入问题。