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

Signaler
Messages postés
50
Date d'inscription
dimanche 28 décembre 2003
Statut
Membre
Dernière intervention
11 avril 2006
-
Messages postés
50
Date d'inscription
dimanche 28 décembre 2003
Statut
Membre
Dernière intervention
11 avril 2006
-
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 :)

3 réponses

Messages postés
50
Date d'inscription
dimanche 28 décembre 2003
Statut
Membre
Dernière intervention
11 avril 2006
1
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 :)
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Salut,

A tout hasard jette donc un oeil à .Math.

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
50
Date d'inscription
dimanche 28 décembre 2003
Statut
Membre
Dernière intervention
11 avril 2006
1
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 ! :)