2008-10-05 168 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這可以提供一種替代方法來處理泛型數學類型。

相關問題