2011-05-09 17 views
11

¿Es posible especificar un operador R donde R puede ser un operador aritmético, relacional o lógico?especifique programáticamente el operador

Por ejemplo, una función que calcula

c = a R b 

donde puedo especificar si es R+, -, *, /

se puede hacer esto en C#?

+0

Sí, es posible, pero la forma más genérica para hacerlo significa el aprendizaje acerca de [Expression Trees] (http://msdn.microsoft.com/en-us/library/bb397951.aspx). :) ¿Cómo se determinará el operador que se utilizará? –

+2

duplicado exacto http://stackoverflow.com/questions/1528319/operators-as-method-parameters-in-c – mcabral

Respuesta

7

Un binary operator es cualquier función que acepta dos operandos. Es simple abstraer esta funcionalidad usando delegates, que básicamente son envoltorios alrededor de métodos (funciones).

Para hacer esto más claro, podemos definir un método genérico que no hace nada más que invocar el delegado usando los parámetros especificados, y devolver su resultado:

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

y usted podría usarlo para pasar cualquier combinación de parámetros y los operadores:

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

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

a continuación, puede utilizar el mismo método genérico para hacer lo que desee operación:

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

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

El uso de las expresiones lambda, incluso se puede crear el operador "sobre la marcha", especificando como un método anónimo:

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

Es posible tener la sobrecarga de operadores en C#, ver algunas de MSDN

http://msdn.microsoft.com/en-us/library/aa288467(v=vs.71).aspx

+5

No parece que el OP quiera cambiar la funcionalidad de un operador dado - parece que, dado dos operandos, quieren elegir la operación en tiempo de ejecución. –

+0

está pidiendo que especifique el operador, no sobrecargue su comportamiento en una clase/estructura – Jimmy

+0

Creo que esta es una buena respuesta; se puede usar para obtener la funcionalidad deseada. –

2

Usted puede hacer algo muy cerca de que el uso de lambda:

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

y luego usarlo como cualquier otro delegado:

int result = op(1, 2); 

Si el tipo en cuestión fuera definido por el usuario con operadores sobrecargados, podría usar la reflexión, pero me temo que no es posible para tipos como int.

Cuestiones relacionadas