使用.Net,我怎样才能确定一个types是一个数值ValueType?
但是这里有一个例子:
Dim desiredType as Type if IsNumeric(desiredType) then ...
编辑:我只知道types,而不是作为一个string的值。
好的,所以不幸的是我必须循环访问TypeCode。
但这是一个很好的方法来做到这一点:
if ((desiredType.IsArray)) return 0; switch (Type.GetTypeCode(desiredType)) { case 3: case 6: case 7: case 9: case 11: case 13: case 14: case 15: return 1; } ;return 0;
在这里晚了几年,但这里是我的解决scheme(你可以select是否包含布尔值)。 解决可空的情况。 包括XUnittesting
/// <summary> /// Determines if a type is numeric. Nullable numeric types are considered numeric. /// </summary> /// <remarks> /// Boolean is not considered numeric. /// </remarks> public static bool IsNumericType( Type type ) { if (type == null) { return false; } switch (Type.GetTypeCode(type)) { case TypeCode.Byte: case TypeCode.Decimal: case TypeCode.Double: case TypeCode.Int16: case TypeCode.Int32: case TypeCode.Int64: case TypeCode.SByte: case TypeCode.Single: case TypeCode.UInt16: case TypeCode.UInt32: case TypeCode.UInt64: return true; case TypeCode.Object: if ( type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) { return IsNumericType(Nullable.GetUnderlyingType(type)); } return false; } return false; } /// <summary> /// Tests the IsNumericType method. /// </summary> [Fact] public void IsNumericTypeTest() { // Non-numeric types Assert.False(TypeHelper.IsNumericType(null)); Assert.False(TypeHelper.IsNumericType(typeof(object))); Assert.False(TypeHelper.IsNumericType(typeof(DBNull))); Assert.False(TypeHelper.IsNumericType(typeof(bool))); Assert.False(TypeHelper.IsNumericType(typeof(char))); Assert.False(TypeHelper.IsNumericType(typeof(DateTime))); Assert.False(TypeHelper.IsNumericType(typeof(string))); // Arrays of numeric and non-numeric types Assert.False(TypeHelper.IsNumericType(typeof(object[]))); Assert.False(TypeHelper.IsNumericType(typeof(DBNull[]))); Assert.False(TypeHelper.IsNumericType(typeof(bool[]))); Assert.False(TypeHelper.IsNumericType(typeof(char[]))); Assert.False(TypeHelper.IsNumericType(typeof(DateTime[]))); Assert.False(TypeHelper.IsNumericType(typeof(string[]))); Assert.False(TypeHelper.IsNumericType(typeof(byte[]))); Assert.False(TypeHelper.IsNumericType(typeof(decimal[]))); Assert.False(TypeHelper.IsNumericType(typeof(double[]))); Assert.False(TypeHelper.IsNumericType(typeof(short[]))); Assert.False(TypeHelper.IsNumericType(typeof(int[]))); Assert.False(TypeHelper.IsNumericType(typeof(long[]))); Assert.False(TypeHelper.IsNumericType(typeof(sbyte[]))); Assert.False(TypeHelper.IsNumericType(typeof(float[]))); Assert.False(TypeHelper.IsNumericType(typeof(ushort[]))); Assert.False(TypeHelper.IsNumericType(typeof(uint[]))); Assert.False(TypeHelper.IsNumericType(typeof(ulong[]))); // numeric types Assert.True(TypeHelper.IsNumericType(typeof(byte))); Assert.True(TypeHelper.IsNumericType(typeof(decimal))); Assert.True(TypeHelper.IsNumericType(typeof(double))); Assert.True(TypeHelper.IsNumericType(typeof(short))); Assert.True(TypeHelper.IsNumericType(typeof(int))); Assert.True(TypeHelper.IsNumericType(typeof(long))); Assert.True(TypeHelper.IsNumericType(typeof(sbyte))); Assert.True(TypeHelper.IsNumericType(typeof(float))); Assert.True(TypeHelper.IsNumericType(typeof(ushort))); Assert.True(TypeHelper.IsNumericType(typeof(uint))); Assert.True(TypeHelper.IsNumericType(typeof(ulong))); // Nullable non-numeric types Assert.False(TypeHelper.IsNumericType(typeof(bool?))); Assert.False(TypeHelper.IsNumericType(typeof(char?))); Assert.False(TypeHelper.IsNumericType(typeof(DateTime?))); // Nullable numeric types Assert.True(TypeHelper.IsNumericType(typeof(byte?))); Assert.True(TypeHelper.IsNumericType(typeof(decimal?))); Assert.True(TypeHelper.IsNumericType(typeof(double?))); Assert.True(TypeHelper.IsNumericType(typeof(short?))); Assert.True(TypeHelper.IsNumericType(typeof(int?))); Assert.True(TypeHelper.IsNumericType(typeof(long?))); Assert.True(TypeHelper.IsNumericType(typeof(sbyte?))); Assert.True(TypeHelper.IsNumericType(typeof(float?))); Assert.True(TypeHelper.IsNumericType(typeof(ushort?))); Assert.True(TypeHelper.IsNumericType(typeof(uint?))); Assert.True(TypeHelper.IsNumericType(typeof(ulong?))); // Testing with GetType because of handling with non-numerics. See: // http://msdn.microsoft.com/en-us/library/ms366789.aspx // Using GetType - non-numeric Assert.False(TypeHelper.IsNumericType((new object()).GetType())); Assert.False(TypeHelper.IsNumericType(DBNull.Value.GetType())); Assert.False(TypeHelper.IsNumericType(true.GetType())); Assert.False(TypeHelper.IsNumericType('a'.GetType())); Assert.False(TypeHelper.IsNumericType((new DateTime(2009, 1, 1)).GetType())); Assert.False(TypeHelper.IsNumericType(string.Empty.GetType())); // Using GetType - numeric types // ReSharper disable RedundantCast Assert.True(TypeHelper.IsNumericType((new byte()).GetType())); Assert.True(TypeHelper.IsNumericType(43.2m.GetType())); Assert.True(TypeHelper.IsNumericType(43.2d.GetType())); Assert.True(TypeHelper.IsNumericType(((short)2).GetType())); Assert.True(TypeHelper.IsNumericType(((int)2).GetType())); Assert.True(TypeHelper.IsNumericType(((long)2).GetType())); Assert.True(TypeHelper.IsNumericType(((sbyte)2).GetType())); Assert.True(TypeHelper.IsNumericType(2f.GetType())); Assert.True(TypeHelper.IsNumericType(((ushort)2).GetType())); Assert.True(TypeHelper.IsNumericType(((uint)2).GetType())); Assert.True(TypeHelper.IsNumericType(((ulong)2).GetType())); // ReSharper restore RedundantCast // Using GetType - nullable non-numeric types bool? nullableBool = true; Assert.False(TypeHelper.IsNumericType(nullableBool.GetType())); char? nullableChar = ' '; Assert.False(TypeHelper.IsNumericType(nullableChar.GetType())); DateTime? nullableDateTime = new DateTime(2009, 1, 1); Assert.False(TypeHelper.IsNumericType(nullableDateTime.GetType())); // Using GetType - nullable numeric types byte? nullableByte = 12; Assert.True(TypeHelper.IsNumericType(nullableByte.GetType())); decimal? nullableDecimal = 12.2m; Assert.True(TypeHelper.IsNumericType(nullableDecimal.GetType())); double? nullableDouble = 12.32; Assert.True(TypeHelper.IsNumericType(nullableDouble.GetType())); short? nullableInt16 = 12; Assert.True(TypeHelper.IsNumericType(nullableInt16.GetType())); short? nullableInt32 = 12; Assert.True(TypeHelper.IsNumericType(nullableInt32.GetType())); short? nullableInt64 = 12; Assert.True(TypeHelper.IsNumericType(nullableInt64.GetType())); sbyte? nullableSByte = 12; Assert.True(TypeHelper.IsNumericType(nullableSByte.GetType())); float? nullableSingle = 3.2f; Assert.True(TypeHelper.IsNumericType(nullableSingle.GetType())); ushort? nullableUInt16 = 12; Assert.True(TypeHelper.IsNumericType(nullableUInt16.GetType())); ushort? nullableUInt32 = 12; Assert.True(TypeHelper.IsNumericType(nullableUInt32.GetType())); ushort? nullableUInt64 = 12; Assert.True(TypeHelper.IsNumericType(nullableUInt64.GetType())); }
您可以使用Type.GetTypeCode()
方法找出variables是否为数字:
TypeCode typeCode = Type.GetTypeCode(desiredType); if (typeCode == TypeCode.Double || typeCode == TypeCode.Integer || ...) return true;
您需要完成“…”部分中所有可用的数字types;)
更多细节在这里: TypeCode枚举
这里的大文章探索C#的IsNumeric 。
选项1:
参考Microsoft.VisualBasic.dll,然后执行以下操作:
if (Microsoft.VisualBasic.Information.IsNumeric("5")) { //Do Something }
选项2:
public static bool Isumeric (object Expression) { bool f; ufloat64 a; long l; IConvertible iConvertible = null; if ( ((Expression is IConvertible))) { iConvertible = (IConvertible) Expression; } if (iConvertible == null) { if ( ((Expression is char[]))) { Expression = new String ((char[]) Expression); goto IL_002d; // hopefully inserted by optimizer } return 0; } IL_002d: TypeCode typeCode = iConvertible.GetTypeCode (); if ((typeCode == 18) || (typeCode == 4)) { string str = iConvertible.ToString (null); try { if ( (StringType.IsHexOrOctValue (str, l))) { f = true; return f; } } catch (Exception ) { f = false; return f; }; return DoubleType.TryParse (str, a); } return Utils.IsNumericTypeCode (typeCode); } internal static bool IsNumericType (Type typ) { bool f; TypeCode typeCode; if ( (typ.IsArray)) { return 0; } switch (Type.GetTypeCode (typ)) { case 3: case 6: case 7: case 9: case 11: case 13: case 14: case 15: return 1; }; return 0; }
如果你有一个实际的对象的引用,这是一个简单的C#解决scheme,非常简单:
/// <summary> /// Determines whether the supplied object is a .NET numeric system type /// </summary> /// <param name="val">The object to test</param> /// <returns>true=Is numeric; false=Not numeric</returns> public static bool IsNumeric(ref object val) { if (val == null) return false; // Test for numeric type, returning true if match if ( val is double || val is float || val is int || val is long || val is decimal || val is short || val is uint || val is ushort || val is ulong || val is byte || val is sbyte ) return true; // Not numeric return false; }
有了@ SFun28和@nawfal(谢谢!)的所有应有的功劳,我用了他们的答案,微调了一下,并提出了这些扩展方法:
public static class ReflectionExtensions { public static bool IsNullable(this Type type) { return type != null && type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>); } public static bool IsNumeric(this Type type) { if (type == null || type.IsEnum) return false; if (IsNullable(type)) return IsNumeric(Nullable.GetUnderlyingType(type)); switch (Type.GetTypeCode(type)) { case TypeCode.Byte: case TypeCode.Decimal: case TypeCode.Double: case TypeCode.Int16: case TypeCode.Int32: case TypeCode.Int64: case TypeCode.SByte: case TypeCode.Single: case TypeCode.UInt16: case TypeCode.UInt32: case TypeCode.UInt64: return true; default: return false; } } }
''// Return true if a type is a numeric type. Private Function IsNumericType(ByVal this As Type) As Boolean ''// All the numeric types have bits 11xx set whereas non numeric do not. ''// That is if you include char type which is 4(decimal) = 100(binary). If this.IsArray Then Return False If (Type.GetTypeCode(this) And &HC) > 0 Then Return True Return False End Function
这是MS在System.Dynamic.Utils.TypeUtils
中实现它的一个内部类。 原来,他们不认为System.Decimal
是一个数字types(从数字中省略了Decimal
)。 有趣的是,MS发现System.Char
types是数字。 否则它和SFun28的答案完全一样。 我想他的答案是“更正确的”。
internal static bool IsNumeric(Type type) { type = type.GetNonNullableType(); if (!type.IsEnum) { switch (Type.GetTypeCode(type)) { case TypeCode.Char: case TypeCode.SByte: case TypeCode.Byte: case TypeCode.Int16: case TypeCode.UInt16: case TypeCode.Int32: case TypeCode.UInt32: case TypeCode.Int64: case TypeCode.UInt64: case TypeCode.Single: case TypeCode.Double: return true; } } return false; } //where GetNonNullableType is defined as internal static Type GetNonNullableType(this Type type) { if (type.IsNullableType()) { return type.GetGenericArguments()[0]; } return type; } //where IsNullableType is defined as internal static bool IsNullableType(this Type type) { return type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>); }
我知道这是一个非常晚的答案,但这里是我使用的function:
public static bool IsNumeric(Type type) { var t = Nullable.GetUnderlyingType(type) ?? type; return t.IsPrimitive || t == typeof(decimal); }
如果你想排除char
作为数字types,那么你可以使用这个例子:
return (t.IsPrimitive || t == typeof(decimal)) && t != typeof(char);
根据MSDN :
原始types是布尔,Byte,SByte,Int16,UInt16,Int32,UInt32,Int64,UInt64,IntPtr,UIntPtr,Char,Double和Single。
注意:这个检查包括IntPtr和UIntPtr 。
这是一个普通的扩展方法(我知道这不适用于OP的情况下,但其他人可能会觉得它有用)相同的function:
public static bool IsNumeric<T>(this T value) { var t = Nullable.GetUnderlyingType(value.GetType()) ?? value.GetType(); return t.IsPrimitive || t == typeof(decimal); }
使用Type.IsValueType()和TryParse():
public bool IsInteger(Type t) { int i; return t.IsValueType && int.TryParse(t.ToString(), out i); }