Я знаю, что это ОЧЕНЬ поздний ответ, но вот функция, которую я использую:
public static bool IsNumeric(Type type)
{
var t = Nullable.GetUnderlyingType(type) ?? type;
return t.IsPrimitive || t == typeof(decimal);
}
Если вы хотите исключить char
как числовой тип, вы можете использовать этот пример:
return (t.IsPrimitive || t == typeof(decimal)) && t != typeof(char);
Согласно MSDN :
Примитивные типы: логические, байтовые, SByte, Int16, UInt16, Int32,
UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double и Single.
Примечание: эта проверка включает IntPtr и UIntPtr .
Здесь та же функция, что и у общего метода расширения (я знаю, что это не работает в случае с OP, но кто-то еще может найти его полезным):
public static bool IsNumeric<T>(this T value)
{
var t = Nullable.GetUnderlyingType(value.GetType()) ?? value.GetType();
return t.IsPrimitive || t == typeof(decimal);
}