visual puede postfija porque optimizado método matematicas funciones expresión expresiones expresion evaluar evaluador está definicion código aritmeticas actual c# reflection eval

c# - puede - expresiones matematicas en visual basic definicion



¿Cómo puedo evaluar una expresión de C#de forma dinámica? (7)

¿Cuáles son las implicaciones de rendimiento de hacer esto?

Usamos un sistema basado en algo como el mencionado anteriormente, donde cada script C # se compila en un ensamblaje en memoria y se ejecuta en un AppDomain separado. Todavía no hay un sistema de almacenamiento en caché, por lo que los scripts se vuelven a compilar cada vez que se ejecutan. Realicé algunas pruebas simples y compilé un script muy simple de "Hello World" en aproximadamente 0,7 segundos en mi máquina, que incluía cargar el script desde el disco. 0,7 segundos está bien para un sistema de scripting, pero puede ser demasiado lento para responder a la entrada del usuario, en ese caso un analizador / analizador dedicado como Flee podría ser mejor.

using System; public class Test { static public void DoStuff( Scripting.IJob Job) { Console.WriteLine( "Heps" ); } }

Me gustaría hacer el equivalente de:

object result = Eval("1 + 3"); string now = Eval("System.DateTime.Now().ToString()") as string

Siguiendo el link Biri, obtuve este fragmento (modificado para eliminar el método obsoleto ICodeCompiler.CreateCompiler() :

private object Eval(string sExpression) { CSharpCodeProvider c = new CSharpCodeProvider(); CompilerParameters cp = new CompilerParameters(); cp.ReferencedAssemblies.Add("system.dll"); cp.CompilerOptions = "/t:library"; cp.GenerateInMemory = true; StringBuilder sb = new StringBuilder(""); sb.Append("using System;/n"); sb.Append("namespace CSCodeEvaler{ /n"); sb.Append("public class CSCodeEvaler{ /n"); sb.Append("public object EvalCode(){/n"); sb.Append("return " + sExpression + "; /n"); sb.Append("} /n"); sb.Append("} /n"); sb.Append("}/n"); CompilerResults cr = c.CompileAssemblyFromSource(cp, sb.ToString()); if (cr.Errors.Count > 0) { throw new InvalidExpressionException( string.Format("Error ({0}) evaluating: {1}", cr.Errors[0].ErrorText, sExpression)); } System.Reflection.Assembly a = cr.CompiledAssembly; object o = a.CreateInstance("CSCodeEvaler.CSCodeEvaler"); Type t = o.GetType(); MethodInfo mi = t.GetMethod("EvalCode"); object s = mi.Invoke(o, null); return s; }


Al usar compilar sobre la marcha, como muestra link .

O usando Flee , que es exactamente por la misma razón.


He escrito un proyecto de código abierto, Dynamic Expresso , que puede convertir expresiones de texto escritas utilizando una sintaxis de C # en delegados (o árbol de expresiones). Las expresiones de texto se analizan y se transforman en árboles de expresiones sin usar compilación o reflexión.

Puedes escribir algo como:

var interpreter = new Interpreter(); var result = interpreter.Eval("8 / 2 + 2");

o

var interpreter = new Interpreter() .SetVariable("service", new ServiceExample()); string expression = "x > 4 ? service.aMethod() : service.AnotherMethod()"; Lambda parsedExpression = interpreter.Parse(expression, new Parameter("x", typeof(int))); parsedExpression.Invoke(5);

Mi trabajo se basa en el artículo de Scott Gu http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx .


Parece que también hay una forma de hacerlo usando RegEx y XPathNavigator para evaluar la expresión. No tuve la oportunidad de probarlo todavía, pero me gustó porque no requería compilar código en tiempo de ejecución ni usar bibliotecas que no podían estar disponibles.

http://www.webtips.co.in/c/evaluate-function-in-c-net-as-eval-function-in-javascript.aspx

Lo intentaré y contaré luego si funcionó. También tengo la intención de probarlo en Silverlight, pero ya es demasiado tarde y estoy casi dormido para hacerlo ahora.


Si bien C # no tiene ningún soporte para un método Eval de forma nativa, tengo un programa de evaluación C # que permite evaluar el código C #. Proporciona la evaluación del código C # en el tiempo de ejecución y es compatible con muchas sentencias C #. De hecho, este código se puede utilizar en cualquier proyecto .NET, sin embargo, está limitado a usar la sintaxis C #. Eche un vistazo a mi sitio web, http://csharp-eval.com , para obtener detalles adicionales.


Tema anterior, pero considerando que este es uno de los primeros hilos que aparecen al buscar en Google, aquí hay una solución actualizada.

Puede usar la nueva API de scripting de Roslyn para evaluar expresiones .

Si está utilizando NuGet, simplemente agregue una dependencia a Microsoft.CodeAnalysis.CSharp.Scripting . Para evaluar los ejemplos que proporcionó, es tan simple como:

var result = CSharpScript.EvaluateAsync("1 + 3").Result;

Obviamente, esto no hace uso de las capacidades asincrónicas del motor de scripting.

También puede especificar el tipo de resultado evaluado según lo previsto:

var now = CSharpScript.EvaluateAsync<string>("System.DateTime.Now.ToString()").Result;

Para evaluar fragmentos de código más avanzados, pasar parámetros, proporcionar referencias, espacios de nombres y todo lo demás, consulte el wiki vinculado anteriormente.


using System; using Microsoft.JScript; using Microsoft.JScript.Vsa; using Convert = Microsoft.JScript.Convert; namespace System { public class MathEvaluator : INeedEngine { private VsaEngine vsaEngine; public virtual String Evaluate(string expr) { var engine = (INeedEngine)this; var result = Eval.JScriptEvaluate(expr, engine.GetEngine()); return Convert.ToString(result, true); } VsaEngine INeedEngine.GetEngine() { vsaEngine = vsaEngine ?? VsaEngine.CreateEngineWithType(this.GetType().TypeHandle); return vsaEngine; } void INeedEngine.SetEngine(VsaEngine engine) { vsaEngine = engine; } } }