6

私はジェネリックをあまり使用していないので、重複を減らすためにジェネリックを使用して次の3つの方法を1つに変えることができるかどうかわかりません。実際、私のコードには現在6つのメソッドがありますが、3つで解決できれば、残りは同じソリューションで機能するはずです。

    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項演算を評価する必要があります。上記のメソッドを使用して、関連する型を使用して実際の計算を実行します。しかし、もっと良い答えがなければなりません!

4

2 に答える 2

9

ジェネリックスは、算術演算をネイティブにサポートしていません。ただし、.NET3.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を直接使用することをお勧めしますが、上記を使用することを歓迎します。

于 2008-10-05T08:14:59.827 に答える
4

Marc Gravellは、一般的な数学を実行可能にするために多くの作業を行ってきました。この問題に関するMiscUtil および一般的な記事を参照してください。

MiscUtilの現在のバージョンのコードでは、式ツリーを使用しているため、.NET3.5が必要です。ただし、Marcには.NET2.0でも動作するバージョンがあると思います。これが人々に役立つのであれば、何らかの形で組み込むことができると確信しています(おそらく、実行時にフレームワークのバージョンに基づいて適切な実装を使用するMiscUtil自体のファサードを使用します)。

将来的には、一般的な数学タイプを操作する別の方法を提供できる静的インターフェイスが必要です。

于 2008-10-05T08:16:25.923 に答える