簡體   English   中英

如何使用C#泛型將這3種方法合並為一種?

[英]How to turn these 3 methods into one using 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");
        }
    }

我正在構建一個簡單的表達式解析器,然后需要評估簡單的二進制操作,如加法/減法等。我使用上面的方法來獲得使用相關類型執行的實際數學。 但必須有一個更好的答案!

泛型本身不支持算術。 但是,它可以使用.NET 3.5完成, 就像這樣 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可能是個好主意,但歡迎您使用上述內容。

Marc Gravell在使通用數學成為可行方面做了大量工作。 請參閱MiscUtil有關該問題的一般文章

由於使用了表達式樹,當前版本的MiscUtil中的代碼需要.NET 3.5。 但是,我相信Marc也有一個適用於.NET 2.0的版本。 如果這對人們有用,我確信我們可以以某種方式合並它(可能在MiscUtil本身中有一個外觀,它將在運行時使用基於框架版本的適當實現)。

對於未來,我希望看到靜態接口 ,它可以提供一種使用泛型數學類型的替代方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM