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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
1 187
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Generics изначально не поддерживает арифметику. Однако это можно сделать с помощью .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 напрямую, но вы можете использовать приведенное выше.

Вопреки распространенному мнению, мы с Марком на самом деле два разных человека. Просто мы, кажется, время от времени разделяем мнение.

Jon Skeet 05.10.2008 12:17

Может, мы просто считать, что ... когда-нибудь видели Бойцовский клуб?

Marc Gravell 05.10.2008 12:20

@Eric: Я думаю, что он использует инъекцию зависимостей - я просто беспокоюсь, что у меня есть макет Rhino, а у Джона есть производственная версия ...

Marc Gravell 05.10.2008 12:22

Это действительно здорово. Я все еще думаю, что MS должна была добавить поддержку операторов в дженерики :-(

Orion Edwards 06.10.2008 00:37

Марк Гравелл проделал большую работу, чтобы сделать универсальную математику жизнеспособной. См. MiscUtil и общая статья о проблеме.

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

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

Наверное, надо будет 2.0 переделать - думаю сдох на HDD; Однажды я отправил вам копию по электронной почте - неужели она у вас все еще есть? Впрочем, это небольшой объем работы ...

Marc Gravell 05.10.2008 12:19

Вполне возможно, что он у меня есть. Не могу проверить сейчас, но посмотрю позже, если вы напомните мне.

Jon Skeet 05.10.2008 13:03

Другие вопросы по теме