private static object ParseNumber(string text, Type type)
{
switch (Type.GetTypeCode(GetNonNullableType(type)))
{
case TypeCode.SByte:
sbyte sb;
if (sbyte.TryParse(text, out sb) || sbyte.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out sb)) return sb;
break;
case TypeCode.Byte:
byte b;
if (byte.TryParse(text, out b) || byte.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out b)) return b;
break;
case TypeCode.Int16:
short s;
if (short.TryParse(text, out s) || short.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out s)) return s;
break;
case TypeCode.UInt16:
ushort us;
if (ushort.TryParse(text, out us) || ushort.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out us)) return us;
break;
case TypeCode.Int32:
int i;
if (int.TryParse(text, out i) || int.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out i)) return i;
break;
case TypeCode.UInt32:
uint ui;
if (uint.TryParse(text, out ui) || uint.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out ui)) return ui;
break;
case TypeCode.Int64:
long l;
if (long.TryParse(text, out l) || long.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out l)) return l;
break;
case TypeCode.UInt64:
ulong ul;
if (ulong.TryParse(text, out ul) || ulong.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out ul)) return ul;
break;
case TypeCode.Single:
float f;
if (float.TryParse(text, out f) || float.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out f)) return f;
break;
case TypeCode.Double:
double d;
if (double.TryParse(text, out d) || double.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out d)) return d;
break;
case TypeCode.Decimal:
decimal e;
if (decimal.TryParse(text, out e) || decimal.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out e)) return e;
break;
}
return null;
}