有没有办法调用静态函数而不必提及类型?

时间:2011-09-07 15:30:20

标签: c#

简单的问题,我认为这不可能,但之前一直感到惊讶。

我有一个包含各种数学函数的库,让我们举一个非常简单的示例floorcap:

class MathLib {
    public static double floorcap(double floor, double value, double cap) {
        return Math.Min(Math.Max(floor, value), cap);
    }
}

在另一个类的另一个方法中,我只想输入

var mat_adjusted = floorcap(1, maturity, 5);

但这不起作用,因为它没有在这个类中声明,它在库中。它让我输入

var mat_adjusted = MathLib.floorcap(1, maturity, 5);

它会给代码增加噪音。我可以将它缩短为

using m = MyMathLibrary.MathLib;

.. yadayada

var mat_adjusted = m.floorcap(1, maturity, 5);

但是,我宁愿不必一直输入类名。那可能吗?我也用F#编写代码,你有点习惯在一段时间后不必拼出类型/模块等。当我不得不写C#时,这件事让我感到恼火(一点点),因为它会分散注意力的东西。

这里有很多功能,当你需要调用几个嵌套的函数等时,所有这些点和类名都会加起来。我喜欢我的代码尽可能干净。

提前致谢,

格特 - 扬

5 个答案:

答案 0 :(得分:5)

不,这是不可能的 - 它必须在其所在的范围内被限定(显然如果事物位于当前上下文的范围内那么你可以,但是那个未命中问题和目标的要点。)

这是因为没有任何东西直接比任何类型等都高,所以没有“全球呼叫”的感觉,可以这么说。

答案 1 :(得分:3)

执行此操作的一种方法是改为使用扩展方法。例如,如果在静态类中定义示例函数:

static class MathLib
{
    public static double floorcap(this double value, double floor, double cap)
    {
        return Math.Min(Math.Max(floor, value), cap);
    }
}

然后你可以像这样使用它:

var mat_adjusted = maturity.floorcap(1, 5);

答案 2 :(得分:1)

如果您希望节省输入,可以将方法存根复制并粘贴到每个客户端类中。

private static double floorcap(double floor, double value, double cap) {
    return MathLib.floorcap(floor, value, cap);
}

答案 3 :(得分:0)

可能会给你一些像你想要的东西的唯一方法是使用扩展方法来扩展你想要使用的算术类型:

public static class MathLibExt {
  public static double FloorCap(this double value, double floor, double cap) {
    return Math.Min(Math.Max(floor, value), cap);
  }
}

// call like
var value = 25.0;
var capped = value.FloorCap(1, 10);

答案 4 :(得分:0)

有很多方法可以做到这一点,例如在每个调用库的类中定义private static方法;但是,我认为最好的解决方案就是克服它并每次都输入类名。