将字符串转换为未知数字类型的正确方法是什么?

时间:2009-05-21 22:20:21

标签: c# reflection parsing

我正在创建一个用于内部库的类型转换器,它应该能够从数据库返回的任何类型转换(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());
}

1 个答案:

答案 0 :(得分:4)

什么版本的.NET,以及什么范围的值?例如,一个选项是将其解析为十进制并从那里转换它......

T val = Convert.ChangeType(decimal.Parse("2.1"), typeof(T))

(上面只显示了中央转换 - 它不会尝试将其纳入您现有的代码中)

这对于巨大/非常小的值不起作用,但可能不会遇到与double相同的舍入问题。