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

Atmaweapon 50 Messages postés dimanche 28 décembre 2003Date d'inscription 11 avril 2006 Dernière intervention - 8 juin 2005 à 17:19 - Dernière réponse : Atmaweapon 50 Messages postés dimanche 28 décembre 2003Date d'inscription 11 avril 2006 Dernière intervention
- 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
Atmaweapon 50 Messages postés dimanche 28 décembre 2003Date d'inscription 11 avril 2006 Dernière intervention - 10 juin 2005 à 09:35
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 :)

Merci Atmaweapon 2

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

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

A tout hasard jette donc un oeil à .Math.

Cocoricoooooooo !!!!
coq
MVP Visual C#
Commenter la réponse de cs_coq
Atmaweapon 50 Messages postés dimanche 28 décembre 2003Date d'inscription 11 avril 2006 Dernière intervention - 9 juin 2005 à 09:35
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.