Можно ли указать оператор R
, где R
может быть арифметическим, реляционным или логическим оператором?
Например, функция, которая вычисляет
c = a R b
где я могу указать, есть ли R
+, -, *, /
Можно ли это сделать на С#?
Можно ли указать оператор R
, где R
может быть арифметическим, реляционным или логическим оператором?
Например, функция, которая вычисляет
c = a R b
где я могу указать, есть ли R
+, -, *, /
Можно ли это сделать на С#?
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);
Вы можете сделать что-то очень близкое, используя lambda:
Func<int, int, int> op = (x, y) => x + y; // or any other operator
И затем используйте его, как и любой другой делегат:
int result = op(1, 2);
Если тип, о котором идет речь, определяется пользователем с помощью перегруженных операторов, вы можете использовать отражение, но я боюсь, что это невозможно для таких типов, как int
.
Отъезд Деревья выражений - http://msdn.microsoft.com/en-us/library/bb397951.aspx
В С# возможно перегрузка оператора, проверьте некоторые MSDN
http://msdn.microsoft.com/en-us/library/aa288467(v=vs.71).aspx