NET问答: 是否有通用的方法判断一个 Type 是 Number ?

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NET问答: 是否有通用的方法判断一个 Type 是 Number ?相关的知识,希望对你有一定的参考价值。

咨询区

  • Adi Barda

请问是否有一种方式可以判断 .NET Type 是一个 number,这里的number不单单是 int ,还有可能是 System.UInt32/UInt16/Double 等等,我真的不想写那种长长的 switch case 来摆平这个问题。

比如下面的代码:


public static bool IsNumericType(this object o)
{   
  switch (Type.GetTypeCode(o.GetType()))
  {
    case TypeCode.Byte:
    case TypeCode.SByte:
    case TypeCode.UInt16:
    case TypeCode.UInt32:
    case TypeCode.UInt64:
    case TypeCode.Int16:
    case TypeCode.Int32:
    case TypeCode.Int64:
    case TypeCode.Decimal:
    case TypeCode.Double:
    case TypeCode.Single:
      return true;
    default:
      return false;
  }
}

回答区

  • Jon Skeet

如果你不想使用 switch,可以用 HashSet 或者 Dictionary 来替代,参考如下代码:


public static class TypeHelper
{
    private static readonly HashSet<Type> NumericTypes = new HashSet<Type>
    {
        typeof(int),  typeof(double),  typeof(decimal),
        typeof(long), typeof(short),   typeof(sbyte),
        typeof(byte), typeof(ulong),   typeof(ushort),  
        typeof(uint), typeof(float)
    };
    
    public static bool IsNumeric(Type myType)
    {
       return NumericTypes.Contains(Nullable.GetUnderlyingType(myType) ?? myType);
    }
}

当 .NET 有新的类型加入时,你也可以非常方便的将其加入到 NumericTypes 中,比如:BigInteger 和 Complex。

  • Konamiman

你可以使用 Type.IsPrimitive 并排除掉 BooleanChar 类型,比如下面这样的简单粗暴:


bool IsNumeric(Type type)
{
    return type.IsPrimitive && type!=typeof(char) && type!=typeof(bool);
}

如果你不认为 IntPtr,UintPtr 是 numeric 类型的话,也可以排除掉。

点评区

这套题还是挺有意思的,Konamiman 大佬提供的方法简洁高效,也并没有使用反射,而是直接调取它的 类型句柄 直接判断,学习了!

以上是关于NET问答: 是否有通用的方法判断一个 Type 是 Number ?的主要内容,如果未能解决你的问题,请参考以下文章

JVM垃圾回收问答

是否有一个 .Net C# 分析器可以报告通用方法的不同类型执行的单独统计信息?

NET问答: C# 中是否有 format json 的类库?

是否有通用的方法来读取spark中的多线json。更具体的是火花?

.Net在C#中判断某个类是否实现了某个接口

Java基础--关于Object的一些通用方法