Как превратить эти 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");
        }
    }

Я создаю простой синтаксический анализатор выражений, который затем должен оценить простые двоичные операции, такие как сложение / вычитание и т. Д. Я использую вышеупомянутые методы, чтобы получить действительные математические вычисления, выполняемые с использованием соответствующих типов. Но должен быть лучший ответ!

Ответы на вопрос(2)

Решение Вопроса

это может быть сделано с .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
</t>

Поскольку вы пишете синтаксический анализатор выражений, было бы неплохо использовать Expression напрямую, но выДобро пожаловать использовать выше.

 EricSchaefer05 окт. 2008 г., 10:20
Сменные мозги? Здорово.
 Marc Gravell05 окт. 2008 г., 10:22
@Eric: я думаю, что он использует внедрение зависимости - я 'Я просто волнуюсь, что у меня есть насмешка над Rhino, а у Джона есть производственная версия ...
 Orion Edwards05 окт. 2008 г., 22:37
Тот'действительно круто. Я все еще думаю, что MS должен был добавить поддержку оператора к дженерикам, хотя :-(
 Jon Skeet05 окт. 2008 г., 10:17
Вопреки распространенному мнению, мы с Марком на самом деле два разных человека. Мы просто, кажется, иногда разделяем мнение.
 Marc Gravell05 окт. 2008 г., 10:20
Может быть, мы простосчитать что ... когда-нибудь видел Бойцовский клуб?

тики. УвидетьMiscUtil а такжеобщая статья о проблеме.

Код в текущей версии MiscUtil требует .NET 3.5 из-за использования деревьев выражений. Тем не менее, я считаю, что у Марка есть версия, которая также работает с .NET 2.0. Если это было бы полезно для людей, яЯ уверен, что мы могли бы как-то включить его (возможно, с фасадом в самом MiscUtil, который использовал бы соответствующую реализацию, основанную на версии фреймворка во время выполнения).

На будущее яхотелось бы увидетьстатические интерфейсы который может обеспечить альтернативный способ работы с общими типами математики.

 Marc Gravell05 окт. 2008 г., 10:19
вероятно, мне нужно сделать заново 2.0 - я думаю, что он умер на жестком диске; Я отправил вам копию по электронной почте один раз - неПредположим, у вас все еще есть? Это н'т огромный объем работы, хотя ...
 Jon Skeet05 окт. 2008 г., 11:03
У меня вполне возможно есть это. Можно'Проверьте сейчас, но посмотрим позже, если вы мне напомните.

Ваш ответ на вопрос