Feedback

C# - Math Evaluator

Veröffentlicht von am 04.11.2015
(1 Bewertungen)
Ausführung von einfachen mathematischen Ausdrücken durch inline Compilierung.

Verwendung:

var val = Calculate("10 + 20 * 2 / 20");
Console.WriteLine(val);

var val2 = Calculate("(10 + 20) * 2 / 2");
Console.WriteLine(val2);
        static double Calculate(string expression)
        {
            var options = new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } };
            var provider = new CSharpCodeProvider();
            
            var dlls = new[] { "mscorlib.dll", "System.Core.dll" };
            var tempFile = Path.GetTempFileName() + ".dll";
            var param = new CompilerParameters(dlls, tempFile, true);
            
            param.GenerateInMemory = true;
            param.GenerateExecutable = false;

            var code =  "using System; " +
                        "public class Calculator { " + 
                        "  public static double Run() { " + 
                        "    return " + expression + "; " + 
                        "  } " + 
                        "}";

            CompilerResults result = provider.CompileAssemblyFromSource(param, code);

            if(result.Errors.Count > 0 ){
                var errors = string.Join(" -> ", result.Errors.Cast<CompilerError>().Select(e => e.ErrorText));
                throw new ArgumentException("expression is invalid. Compiler Result: " + errors);
            }
            
            var type = result.CompiledAssembly.GetTypes().First(t => t.Name == "Calculator");
            var calcResult = (double)type.GetMethod("Run").Invoke(null, null);

            return calcResult;
        }
Abgelegt unter math, eval.

2 Kommentare zum Snippet

diub schrieb am 08.11.2015:
Danke dafür. Ich habe es für meine Bedürfnisse angepasst:

- 'dynamic' statt 'double', damit lässt sich Alles verarbeiten
- als Klasse für die Initialsierungen, damit die nicht ständig neu gemacht werden müssen
- StringBuilder genutzt um die Expression zusammenzusetzen
- Bei Fehler Rückgabe wert von 'Null' statt eine Ausnahme

Wichtig: die Debuginformation nicht(!) einschließen, sonst klappt es dann nicht mit allen Typen.

Bei Interesse Nachricht an mich.
v_b schrieb am 08.11.2015:
Da werd ich bekloppt!

Ich habe gerade nachträglich über den Wettbewerb und meine Einreichung geblogt. Da checke ich doch danach meine Mails und eine führt mich hierhin :)

Würde gerne dein Snippet sehen und wenn du kein Problem damit hast, dann als Update auf dem Blog veröffentlichen:
http://dev-things.net

Einfach melden, würde mich freuen!

PS: schon gevoted? :)
 

Logge dich ein, um hier zu kommentieren!