1. C# / Говнокод #2237

    +130.8

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    private static bool EvaluteExpression(string expression, out object result)
            {
                string source =
                    string.Format("public static class Evalutor{{public static object GetValue(){{return {0};}}}}",
                        expression);
    
                using (Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider())
                {
                    System.CodeDom.Compiler.CompilerParameters compilerParams =
                        new System.CodeDom.Compiler.CompilerParameters
                    {
                        GenerateInMemory = true,
                        GenerateExecutable = false
                    };
    
                    System.CodeDom.Compiler.CompilerResults compileResults = provider.CompileAssemblyFromSource(compilerParams, source);
    
                    if (compileResults.NativeCompilerReturnValue == 0)
                    {
                        Type type = compileResults.CompiledAssembly.GetType("Evalutor");
                        MethodInfo method = type.GetMethod("GetValue");
                        result = method.Invoke(null, null);
                        return true;
                    }
    
                }
    
                result = null;
                return false;
            }

    некогда было писать эвалютор))
    работает и так

    Запостил: exe-dealer, 07 Декабря 2009

    Комментарии (8) RSS

    • Осталось понять, что это делает на говнокод.ру
      Ответить
    • ну я думал впрягать такую бандуру как clr для вычисления выражений как то говнисто.
      Ответить
      • Впрягать CLR - вполне нормально.
        А вот компайлер - как-то стремно.
        Хоть бы какое-нить подобие кэширования сделали, что-ли...
        Ответить
    • прикручу кэш потом если совсем уж медленно будет
      Ответить
      • А что за экспрешены оно должно вычислять (если не секрет)?
        Ответить
    • вычисление математических, логичесикх, комбинированых выражений,
      поддерживаемые типы: все числовые, булевы и строки
      Ответить
    • nu vobshem dumaiu vsio normalno nada kompilit no ne virazhenia i kesh tan ne nada dobavliat prosta nada kompili po drugomu
      a immeno tak
      private readonly object evaluator;
              private readonly MethodInfo eval;
      
              public MathEx()
              {
                  const string s = "package Evaluator{" +
                                   "  class Evaluator{" +
                                   "    public function Eval(expr : String) : String{" +
                                   "      return eval(expr, \"unsafe\");" +
                                   "    }" +
                                   "  }" +
                                   "}";
      
                  CodeDomProvider compiler = CodeDomProvider.CreateProvider("JScript");
                  CompilerParameters parameters = new CompilerParameters
                                                      {
                                                          CompilerOptions = "/t:library",
                                                          GenerateInMemory = true
                                                      };
      
                  CompilerResults results = compiler.CompileAssemblyFromSource(parameters, s);
                  Type type = results.CompiledAssembly.GetType("Evaluator.Evaluator");
                  evaluator = Activator.CreateInstance(type);
                  eval = type.GetMethod("Eval");
              }
      
              public object Eval(string expression)
              {
                  try
                  {
                      return eval.Invoke(evaluator, new object[] { expression });
                  }
                  catch (Exception ex)
                  {
                      if (Error != null)
                          Error(this, new MathEvaluateEventArgs(ex));
                  }
                  return null;
              }
      Ответить

    Добавить комментарий