使方法接受不同类型的多个数字参数

时间:2015-02-19 14:35:48

标签: c#

基本上我有一个特定的方法,它使用double和int值来计算我想要设置的css类。我在不同的地方做同样的事情但是用int + int代替。

这产生了一个问题,即是否有一个很好的方法来为所有解决方案提供一个。

过载本来是一种方法,但我不想为所有数字变化写一个重载。

所以我想我看看有没有一个特定的接口类型我可以用作泛型类型约束 - 但我找不到一个(因为任何东西都可以实现IConvertible?)

int32反编译的结果:

#if GENERICS_WORK
public struct Int32 : IComparable, IFormattable, IConvertible
    , IComparable<Int32>, IEquatable<Int32>
/// , IArithmetic<Int32>
#else
public struct Int32 : IComparable, IFormattable, IConvertible
#endif

不,没有数字界面。

这就是我提出的 - 它工作正常,但也接受对潜在非数字对象的调用。关于如何使方法更具限制性的任何建议?

    public static string GetThresholdColorClass(IConvertible desiredThreshold, IConvertible actualProgress)
    {
        var actual = actualProgress.ToDouble(CultureInfo.InvariantCulture);
        var desired = desiredThreshold.ToDouble(CultureInfo.InvariantCulture);
        if (actual >= desired)
            return "green";
        if (actual <= 0)
            return "red";
        return "yellow";
    }

1 个答案:

答案 0 :(得分:2)

可悲的是,没有任何东西(例如参见Is there a constraint that restricts my generic method to numeric types?)。你不能制作一个需要&#34;数字&#34;作为参数。

您可以做的只是创建方法的double变体(存在从intdouble的隐式转换,double s可以包含所有int值)

从技术上讲,Gravell编写了一些函数来使用泛型类型进行数学运算...请参阅https://jonskeet.uk/csharp/miscutil/usage/genericoperators.html,但它们有点&#34; hack&#34; ey: - )