Вам просто нужно будет выполнить проверку типов для каждого из основных числовых типов.
Вот метод расширения, который должен выполнять эту работу:
public static bool IsNumber(this object value)
{
return value is sbyte
|| value is byte
|| value is short
|| value is ushort
|| value is int
|| value is uint
|| value is long
|| value is ulong
|| value is float
|| value is double
|| value is decimal;
}
Это должно охватывать все числовые типы.
Обновление
Кажется, вы действительно хотите разобрать номер из строки во время десериализации. В этом случае, вероятно, лучше всего использовать double.TryParse
.
string value = "123.3";
double num;
if (!double.TryParse(value, out num))
throw new InvalidOperationException("Value is not a number.");
Конечно, это не будет обрабатывать очень большие целые числа / длинные десятичные дроби, но если это так, вам просто нужно добавить дополнительные вызовы к long.TryParse
/ decimal.TryParse
/ что угодно еще.