如何在C#中将任何数字类型与零进行比较

Dav*_*veB 14 .net c# silverlight

我想创建一个函数来检查作为参数传递的数值是否具有大于零的值.像这样的东西:

public bool IsGreaterThanZero(object value)
{
    if(value is int)
    {
        return ((int)value > 0);
    }
    else if(value is float)
    {
        // Similar code for float
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

我可以尝试将作为函数参数传递的对象转换为一个数值数据类型,这样我就可以将它与零进行比较,而不是检查if语句中的每个类型吗?如果演员表失败,我会返回false.有没有更好的(阅读更短,更可读)的方式来做到这一点?

编辑: 有人问我是否知道类型将是数字,为什么对象等.我希望这使事情更清楚.

此函数将是Silverlight转换器的一部分,该转换器实现IValueConverter具有转换签名的接口

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
Run Code Online (Sandbox Code Playgroud)

首先,我只想让转换器与int一起工作,但我的想象力开始疯狂,想想如果我有浮点数和其他数字类型.我想让转换器尽可能灵活.最初我认为所有这些额外的信息都会妨碍我想做的事情,所以我没有把它包含在我的问题中.

Ree*_*sey 16

我的偏好是:

public bool IsGreaterThanZero(object value)
{
    if(value is IConvertible)
    {
        return Convert.ToDouble(value) > 0.0;
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

这将安全地处理所有IConvertible类型(包括框架中的所有浮点和整数类型,以及任何自定义类型).


Jon*_*eet 15

来电者是否知道类型?如果是这样,怎么样:

public static bool GreaterThanZero<T>(T value) where T : struct, IComparable<T>
{
    return value.CompareTo(default(T)) > 0;
}
Run Code Online (Sandbox Code Playgroud)

不需要转换,并且应该适用于任何内置数字类型 - 以及您自己提出的任何合理的值类型.(例如,Noda Time的Duration结构就可以了.)

请注意,调用者不必直接知道类型- 它可能只知道具有相同约束的另一个类型参数.诚然,这可能不适合你的情况,但我想我还是会提到它.如果在编译时没有什么可以知道类型(并且你不想在C#4中为你做这个工作的动态类型!)那么调用Convert.ToDouble可能是你最好的选择 - 只要知道它可能有System.Numerics.BigInteger来自.NET的问题4.0.