¿Cómo puedo evaluar el código C# dinámicamente?

Resuelto Adhip Gupta asked hace 16 años • 16 respuestas

Puedo hacer una eval("something()");ejecución dinámica del código en JavaScript. ¿Hay alguna manera de hacer lo mismo en C#?

Un ejemplo de lo que estoy tratando de hacer es: Tengo una variable entera (digamos i) y tengo varias propiedades con los nombres: "Propiedad1", "Propiedad2", "Propiedad3", etc. Ahora, quiero realizar algunas operaciones. en la propiedad "Propiedad i " dependiendo del valor de i.

Esto es realmente sencillo con Javascript. ¿Hay alguna manera de hacer esto con C#?

Adhip Gupta avatar Aug 07 '08 19:08 Adhip Gupta
Aceptado

Usando la API de secuencias de comandos de Roslyn. Más ejemplos en la wiki de Rolsyn .

// add NuGet package 'Microsoft.CodeAnalysis.Scripting'
using Microsoft.CodeAnalysis.CSharp.Scripting;

await CSharpScript.EvaluateAsync("System.Math.Pow(2, 4)") // returns 16

También puedes ejecutar cualquier fragmento de código:

var script = await CSharpScript.RunAsync(@"
                class MyClass
                { 
                    public void Print() => System.Console.WriteLine(1);
                }")

Y haga referencia al código que se generó en ejecuciones anteriores:

await script.ContinueWithAsync("new MyClass().Print();");
Eli Arbel avatar Jun 23 '2016 06:06 Eli Arbel

DESCARGO DE RESPONSABILIDAD: Esta respuesta se escribió en 2008. El panorama ha cambiado drásticamente desde entonces.

Mire las otras respuestas en esta página, especialmente la que detalla Microsoft.CodeAnalysis.CSharp.Scripting.

El resto de la respuesta se dejará tal como se publicó originalmente, pero ya no es exacta.


Desafortunadamente, C# no es un lenguaje dinámico como ese.

Sin embargo, lo que puede hacer es crear un archivo de código fuente de C#, lleno de clases y todo, ejecutarlo a través del proveedor CodeDom para C#, compilarlo en un ensamblado y luego ejecutarlo.

Esta publicación del foro en MSDN contiene una respuesta con un código de ejemplo en la página: ¿
crear un método anónimo a partir de una cadena?

Difícilmente diría que sea una muy buena solución, pero de todos modos es posible.

¿Qué tipo de código esperarías en esa cadena? Si se trata de un subconjunto menor de código válido, por ejemplo, solo expresiones matemáticas, es posible que existan otras alternativas.


Editar : Bueno, eso me enseña a leer las preguntas detenidamente primero. Sí, la reflexión podría ayudarte aquí.

Si divide la cadena por ; Primero, para obtener propiedades individuales, puede usar el siguiente código para obtener un objeto PropertyInfo para una propiedad particular de una clase y luego usar ese objeto para manipular un objeto particular.

String propName = "Text";
PropertyInfo pi = someObject.GetType().GetProperty(propName);
pi.SetValue(someObject, "New Value", new Object[0]);

Enlace: Método PropertyInfo.SetValue

Lasse V. Karlsen avatar Aug 07 '2008 12:08 Lasse V. Karlsen