C#中是否有类似于Java的Number类的等效类?

4
我是一个新手,从Java来到了C#,我想检查某个对象是否为数字(它可以是整数、双精度浮点数、浮点数等)。在Java中,我使用if(toRet instanceof Number)实现这个功能。希望有类似于if(toRet is Number)的C#方法,但目前我还没有找到可以实现此功能的Number类。有没有办法做到这一点,或者我必须手动检查整数、双精度浮点数等呢?
编辑获取更多信息:基本上我想要的是最后有一个字节数组,但当这个数组存储在文本文件中时,我正在使用的解析器有时会将其视为整数数组或双精度浮点数数组。在Java中,我有这样的代码:
JSONArray dblist = (JSONArray)result_;
byte[] reallyToRet = new byte[dblist.size()];
Object toComp = dblist.get(0);

if (toComp instanceof Number)
    for (int i=0; i < dblist.size(); ++i) {
        byte elem = ((Number) dblist.get(i)).byteValue();
        reallyToRet[i] = elem;
    }

    return reallyToRet;
}

重要的部分在于if语句。有时,dblist中的对象会被解析为整数,有时为双精度浮点数,只有很少情况下才会被解析为字节,但最终我真正关心的是字节值。

没有直接的等价物,但做起来肯定不难。然而,上下文很重要,哪种解决方案最好取决于具体情况。你能发一些代码吗? - Joel Coehoorn
看起来常用的解决方案是创建自己的检查。 https://dev59.com/y3NA5IYBdhLWcg3wAIzd - Jeroen Vannevel
3
在C#中没有必要这样做,因为C#是一种强类型语言,使用未经过类型定义的内容(例如具有类型为object参数的方法)并不是一个好主意。如果需要此类内容,请提供相关上下文代码。 - Federico Berasategui
@HighCore:Java也是强类型的。但在Java中有一个名为Number的类,甚至像ByteDoubleIntegerShort这样的类都继承自它。 - Tim Schmelter
@firechant 我使用的解析器有时会将其视为整数数组或双精度数组 - 使用File.ReadAllText()或类似方法并自行解析值。在.NET中不需要这样的东西。此外,请发布您需要读取的示例数据片段(文本文件)。在C#中不需要这样的“解析器”或其他任何东西。 - Federico Berasategui
3
考虑 is IConvertible,这是所有你感兴趣的值类型都实现的接口。无论如何,你需要它来实际获取值。 - Hans Passant
2个回答

10

嗯,是的,但它是一个扩展方法,只是将所有可能性进行OR运算。

这就是它:

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
            || value is BigInteger;
}

你可以像这样使用它:

if (toRet.IsNumber());

这需要放在一个静态类中。


1
重要的是要提到这段代码必须存在于一个“静态类”中,否则它将无法编译。OP可能不知道什么是“扩展方法”,因为在Java中没有这样的东西。 - Federico Berasategui
@HighCore 也许让 OP 知道 C# 的强大是个好主意! - Bill Zhang
1
为了减少可能性的范围,我会将值的类型限制为IComparable而不是object,因为所有这些类型都实现了IComparable。 - digEmAll
1
@digEmAll 它被传递为“对象”,所以你不能这样做。 - It'sNotALie.

0

我不确定是否有适用于此的任何类。但是您可以查看例如整数

int val;
if(Int32.TryParse(integer, out val))  

else

不太可能,你可以使用 Double.TryParse(number, out val) 等方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接