[.Net] Evaluation d'expression arithmétiques [Résolu]

Messages postés
50
Date d'inscription
dimanche 28 décembre 2003
Dernière intervention
11 avril 2006
- - Dernière réponse : Atmaweapon
Messages postés
50
Date d'inscription
dimanche 28 décembre 2003
Dernière intervention
11 avril 2006
- 10 juin 2005 à 09:35
Bonjour,



ma question est simple : existe-t-il un évaluateur d'expression arithmétique dans les lib de c# sous .net ?

Genre par exemple, j'aimerais que la String "12+13*5" me retourne 77



S'il en existe, je suis encore plus exigeant : existe-t-il carrément un
évaluateur d'expression c# comme il peut en exister en php (la je suis
conscient que j'en demande beaucoup... mais sait-on jamais...) ?

Par exemple, le code :

String toto = "hello";

EvaluateurC#.Eval("toto += " world !";");

System.Console.WriteLine(toto); // affiche "hello world"



Question subsidiaire : si cela n'existe pas sous .net ... cela peut-il exister dans une lib gratuite ?





Merci d'avance :)
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Messages postés
50
Date d'inscription
dimanche 28 décembre 2003
Dernière intervention
11 avril 2006
2
Merci
J'ai finalement trouvé "mieux" encore que cette lib (grace a un autre forum :) )

Le procédé est d'executer un script ActiveX (VBScript par exemple) qui sera interprété pour fournir le résultat attendu.

Un p'tit code d'exemple :



public class classeTest

{

private string monTexte = "";

public classeTest(){}



[STAThread]

static void Main(string[] args)

{

Type scriptControlType = Type.GetTypeFromProgID("scriptcontrol");

object scriptControl = Activator.CreateInstance(scriptControlType);

Console.WriteLine(scriptControlType);



// AllowUI = false

scriptControlType.InvokeMember("AllowUI",

System.Reflection.BindingFlags.Public |


System.Reflection.BindingFlags.SetProperty, null,
scriptControl,

new object[]{false});



// Language = VBScript

scriptControlType.InvokeMember("Language",

System.Reflection.BindingFlags.Public |


System.Reflection.BindingFlags.SetProperty, null,
scriptControl,

new object[]{"VBScript"});



string evalText = "12 + 13 * 5";



// Eval(evalText)

object o = scriptControlType.InvokeMember("Eval",

System.Reflection.BindingFlags.Public |


System.Reflection.BindingFlags.InvokeMethod, null,
scriptControl,

new object[]{evalText});




Console.WriteLine("Eval=" + o + " (" + o.GetType().FullName + ")"); //
renvoie "Eval=77 (System.Int16)"



// plus sophistiqué!



string
functionText "Function MyFunc(text): MyFunc text & " world!":
End Function";



scriptControlType.InvokeMember("AddCode",

System.Reflection.BindingFlags.Public |


System.Reflection.BindingFlags.InvokeMethod, null,
scriptControl,

new object[]{functionText});



// Run myFunc(...)

string text = "Hello";

o = scriptControlType.InvokeMember("Run",

System.Reflection.BindingFlags.Public |


System.Reflection.BindingFlags.InvokeMethod, null,
scriptControl,

new object[]{"MyFunc", text});




Console.WriteLine("Run=" + o + " (" + o.GetType().FullName + ")"); //
renvoie "Run=Hello world! (System.String)"



classeTest c1 = new classeTest();



// un peu plus sophistiqué!

// le nom de
l'objet (ici 'csharp') devient utilisable dans tout le code ajouté au
scriptcontrol.

// pour info,
c'est comme cela que window ou document sont gérés par Internet
Explorer, ou que request, session, ... sont gérés par ASP classique.

scriptControlType.InvokeMember("AddObject",

System.Reflection.BindingFlags.Public |


System.Reflection.BindingFlags.InvokeMethod, null,
scriptControl,

new object[]{"csharp", c1, true});



evalText =
"csharp.GetText("hello")"; // un code VBScript utilisant l'objet
'csharp' qui est l'instance c1 créee plus haut.

o = scriptControlType.InvokeMember("Eval",

System.Reflection.BindingFlags.Public |


System.Reflection.BindingFlags.InvokeMethod, null,
scriptControl,

new object[]{evalText});




Console.WriteLine("Eval=" + o + " (" + o.GetType().FullName + ")"); //
renvoie "Eval=hello from C# (System.String)"



Console.WriteLine("Valeur de 'monTexte' au début (C#) :");

Console.WriteLine(c1.AfficheText());



evalText =
"csharp.AfficheText()"; // un code VBScript utilisant l'objet 'csharp'
qui est l'instance c1 créee plus haut.

o = scriptControlType.InvokeMember("Eval",

System.Reflection.BindingFlags.Public |


System.Reflection.BindingFlags.InvokeMethod, null,
scriptControl,

new object[]{evalText});



Console.WriteLine("Valeur de 'monTexte' au début (VBScript) :");

Console.WriteLine((String)o);



Console.WriteLine("On change 'monTexte' dans VBScript ...");



evalText =
"csharp.SetText("coucou")"; // On change monTexte dans VBScript

scriptControlType.InvokeMember("Eval",

System.Reflection.BindingFlags.Public |


System.Reflection.BindingFlags.InvokeMethod, null,
scriptControl,

new object[]{evalText});



Console.WriteLine("Valeur de 'monTexte' :");

Console.WriteLine(c1.AfficheText());

}



// une méthode publique de la classe

public string GetText(string text)

{

return text + " from C#";

}



public void SetText(string text)

{

monTexte = text;

}



public String AfficheText()

{

return "AfficheText() : "+monTexte;

}

}



Ainsi que quelques liens de référence :

http://msdn.microsoft.com/library/en-us/dnexpvb/html/usingscriptcontrolmethods.asp

http://www.webtropy.com/articles/art14-2.asp?Interop=MSScriptControl

http://support.microsoft.com/kb/q185889/



Merci :)

Dire « Merci » 2

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de Atmaweapon
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
0
Merci
Salut,

A tout hasard jette donc un oeil à .Math.

Cocoricoooooooo !!!!
coq
MVP Visual C#
Commenter la réponse de cs_coq
Messages postés
50
Date d'inscription
dimanche 28 décembre 2003
Dernière intervention
11 avril 2006
0
Merci
Ca a l'air en effet extrêmement intéressant pour ce que je veux faire
(un mini langage "simple" avec opérations arithmétiques et structures
conditionnelles pas "avancées" (juste if-then-else ... mais je me peux
me contenter du if de .Math je pense ... :) )



Merci encore !... je pense que cette lib est extrêmement intéressante ! :)
Commenter la réponse de Atmaweapon

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.