2009-07-30 3 views
4

Est-il possible d'avoir un opérateur dynamique dans C#?Opérateur dynamique C#

string aString = "5"; 
int a = 5; 
int b = 6; 
string op = "<"; 

//want to do something like dynamically without checking the value of op 
if(a op b) 
+2

Essayez googler pour une mise en œuvre C# Eval, comme cela ressemble à ce que vous recherchez. –

+0

Question connexe: http://stackoverflow.com/questions/174664/operators-as-strings –

Répondre

16

Vous ne pouvez pas créer d'opérateurs dynamiques, mais vous pouvez envelopper un opérateur dans un délégué. Vous pouvez utiliser lambdas pour simplifier la syntaxe.

Func<int,int,int> opPlus = (a,b) => a + b; 
Func<int,int,int> opMinus = (a,b) => a - b; 
// etc.. 

// now you can write: 
int a = 5, b = 6; 
Func<int,int,int> op = opPlus; 
if(op(a,b) > 9) 
    DoSomething(); 

Bien que ce ne soit pas définitif, la future direction de C# consiste à implémenter le compilateur en tant que service. Ainsi, à un certain point, il peut être possible d'écrire du code qui évalue dynamiquement une expression.

-1

C# 4.0 aura un mot-clé dynamique pour le typage dynamique.

+0

Limité à v2 atm –

+0

Pourquoi voulez-vous un opérateur dynamique? Peut-être que vous devriez essayer d'utiliser des génériques ou downcast à l'objet –

+0

Interopération avec le cadre dynamique et les langues principalement. – Dykam

1

Vous pourriez trouver quelque chose comme Flee utile. Il y en a d'autres, mais leurs noms m'échappent maintenant.

3

Ferroutage sur la réponse LBushkin:

Func<int, int, bool> AGreaterThanB = (a,b) => a > b; 
Func<int, int, bool> ALessThanB = (a,b) => a < b; 

Func< int, int, bool> op = AGreaterThanB; 

int x = 7; 
int y = 6; 

if (op(x, y)) 
{ 
    Console.WriteLine("X is larger"); 
} 
else 
{ 
    Console.WriteLine("Y is larger"); 
} 

http://msdn.microsoft.com/en-us/library/bb549151.aspx