Программно указать оператор

Можно ли указать оператор R, где R может быть арифметическим, реляционным или логическим оператором?

Например, функция, которая вычисляет

c = a R b

где я могу указать, есть ли R +, -, *, /

Можно ли это сделать на С#?

Ответ 1

A двоичный оператор - это любая функция, которая принимает два операнда. Просто абстрагировать эту функциональность с помощью делегатов, которые в основном являются обертками вокруг методов (функций).

Чтобы сделать это более ясным, мы можем определить общий метод, который не делает ничего более, что вызывает делегата, используя указанные параметры, и возвращает его результат:

public Tout GetResult<TIn, TOut>(TIn a, TIn b, Func<TIn, TIn, TOut> @operator)
{
     return @operator(a, b);
}

И вы можете использовать его для передачи любой комбинации параметров и операторов:

private bool AreEqual(int a, int b)
{
     return a.Equals(b);
}

private int Subtract(int a, int b)
{
     return a - b;
}

Затем вы можете использовать один и тот же общий метод для выполнения любой операции, которую вы хотите:

// use the "AreEqual" operator
bool equal = GetResult(10, 10, AreEqual);

// use the "Subtract" operator
int difference = GetResult(10, 10, Subtract);

Используя лямбда-выражения, вы даже можете создать оператор "на лету", указав его как анонимный метод:

// define a "Product" operator as an anonymous method
int product = GetResult(10, 10, (a,b) => a*b);

Ответ 2

Вы можете сделать что-то очень близкое, используя lambda:

Func<int, int, int> op = (x, y) => x + y; // or any other operator

И затем используйте его, как и любой другой делегат:

int result = op(1, 2);

Если тип, о котором идет речь, определяется пользователем с помощью перегруженных операторов, вы можете использовать отражение, но я боюсь, что это невозможно для таких типов, как int.