Vous pouvez écrire la classe Evaluator comme ci-dessous pour exécuter du code C# dynamiquement:
public class Evaluator
{
public int Evaluate(string expression)
{
CSharpCodeProvider codeProvider = new CSharpCodeProvider();
CompilerParameters compilerParameters = new CompilerParameters();
compilerParameters.ReferencedAssemblies.Add("system.dll");
compilerParameters.CompilerOptions = "/t:library";
compilerParameters.GenerateInMemory = true;
StringBuilder typeDefinition = new StringBuilder("");
typeDefinition.AppendLine("using System;");
typeDefinition.AppendLine("namespace Evaluator");
typeDefinition.AppendLine("{");
typeDefinition.AppendLine(" public class Evaluator");
typeDefinition.AppendLine(" {");
typeDefinition.AppendLine(" public object Evaluate()");
typeDefinition.AppendLine(" {");
typeDefinition.AppendLine(" return " + expression + ";");
typeDefinition.AppendLine(" }");
typeDefinition.AppendLine(" }");
typeDefinition.AppendLine("}");
CompilerResults compilerResult = codeProvider.CompileAssemblyFromSource(compilerParameters, typeDefinition.ToString());
System.Reflection.Assembly a = compilerResult.CompiledAssembly;
object o = a.CreateInstance("Evaluator.Evaluator");
Type dynamicEvaluatorType = o.GetType();
MethodInfo dynamicEvaluateMethod = dynamicEvaluatorType.GetMethod("Evaluate");
return (int) dynamicEvaluateMethod.Invoke(o, null);
}
}
Ensuite, vous pouvez l'utiliser comme ça:
string expression = "4*5+2";
int result = new Evaluator().Evaluate(expression);
Je ne vois aucune solution simple. Vous devez marquer l'expression et remplacer le complexe '^' par Math.Pow' .... – xanatos
Il est complexe de marquer l'expression car 5+ (3 + 2)^(4 + 3) est "complexe" (les parenthèses) ... et il peut devenir encore plus complexe facilement. – xanatos