2008-10-05 167 views
6

我还没有使用过泛型,所以无法弄清楚是否可以将以下三种方法变成一种使用泛型来减少重复的方法。其实我的代码目前有六种方法,但如果你可以解决这三个问题,那么剩下的就可以用同样的解决方案工作。如何将这3种方法变成一种使用C#泛型的方法?

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"); 
     } 
    } 

我建立一个简单的表达式解析器,则需要评估的简单的二进制运算,如加法/减法等我用上面的方法来获取实际的数学使用相关的类型进行。但是必须有更好的答案!

回答

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 

既然你正在编写一个表达式解析器,它可能是直接使用表达好主意,但欢迎您使用上面。

+0

与流行的猜测相反,Marc和我实际上是两个不同的人。我们似乎偶尔分享一下心灵。 – 2008-10-05 08:17:04

+0

也许我们只是认为......曾经见过搏击俱乐部? – 2008-10-05 08:20:27

4

Marc Gravell在使通用数学可行方面做了大量的工作。请参阅MiscUtilgeneral article about the issue

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

未来,我希望看到static interfaces这可以提供一种替代方法来处理泛型数学类型。

相关问题