如何使用C#泛型将这3种方法合并为一种?

时间:2008-10-05 08:10:09

标签: c# generics

我没有使用泛型,因此无法弄清楚是否可以使用泛型将以下三种方法合并为一种以减少重复。实际上我的代码目前有六种方法,但如果你可以解决这三种方法,那么其余的应该只使用相同的解决方案。

    private object EvaluateUInt64(UInt64 x, UInt64 y)
    {
        switch (Operation)
        {
            case BinaryOp.Add:
                return x + y;
            case BinaryOp.Subtract:
                return x - y;
            case BinaryOp.Multiply:
                return x * y;
            case BinaryOp.Divide:
                return x / y;
            case BinaryOp.Remainder:
                return x % y;
            default:
                throw new ApplicationException("error");
        }
    }

    private object EvaluateFloat(float x, float y)
    {
        switch(Operation)
        {
            case BinaryOp.Add:
                return x + y;
            case BinaryOp.Subtract:
                return x - y;
            case BinaryOp.Multiply:
                return x * y;
            case BinaryOp.Divide:
                return x / y;
            case BinaryOp.Remainder:
                return x % y;
            default:
                throw new ApplicationException("error");
        }
    }

    private object EvaluateDouble(double x, double y)
    {
        switch (Operation)
        {
            case BinaryOp.Add:
                return x + y;
            case BinaryOp.Subtract:
                return x - y;
            case BinaryOp.Multiply:
                return x * y;
            case BinaryOp.Divide:
                return x / y;
            case BinaryOp.Remainder:
                return x % y;
            default:
                throw new ApplicationException("error");
        }
    }

我正在构建一个简单的表达式解析器,然后需要评估简单的二进制操作,例如加法/减法等。我使用上面的方法来获得使用相关类型执行的实际数学。但必须有一个更好的答案!

2 个答案:

答案 0 :(得分:9)

泛型本身不支持算术。但是,它可以使用.NET 3.5,like so完成。 Operator类是MiscUtil的一部分。然后变成:

   public T Evaluate<T>(T x, T y) {
      switch (Operation)
      {
        case BinaryOp.Add:
            return Operator.Add(x, y);
        case BinaryOp.Subtract:
            return Operator.Subtract(x, y);
     ... etc

由于您正在编写表达式解析器,因此最好直接使用Expression,但欢迎您使用上述。

答案 1 :(得分:4)

Marc Gravell在使通用数学成为可行方面做了大量工作。查看MiscUtilgeneral article about the issue

当前版本的MiscUtil中的代码由于使用了表达式树而需要.NET 3.5。但是,我相信Marc也有一个适用于.NET 2.0的版本。如果这对人们有用,我确信我们可以以某种方式合并它(可能在MiscUtil中使用Facade,它将在运行时使用基于框架版本的适当实现)。

对于未来,我希望static interfaces能够提供另一种处理泛型数学类型的方法。