Puedo hacer un eval("something()");
para ejecutar el código dinámicamente en JavaScript. ¿Hay alguna forma 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 por los nombres: "Propiedad1", "Propiedad2", "Propiedad3", etc. Ahora, quiero realizar algunas operaciones en la "Propiedad i " dependiendo del valor de i
.
Esto es realmente simple con Javascript. ¿Hay alguna forma de hacer esto con C #?
c#
reflection
properties
c#-2.0
Adhip Gupta
fuente
fuente
Respuestas:
Desafortunadamente, C # no es un lenguaje dinámico como ese.
Lo que puede hacer, sin embargo, es crear un archivo de código fuente C #, lleno de clase y todo, y ejecutarlo a través del proveedor CodeDom para C # y compilarlo en un ensamblado, y luego ejecutarlo.
Esta publicación del foro en MSDN contiene una respuesta con algún código de ejemplo en la página: ¿
crear un método anónimo a partir de una cadena?
Difícilmente diría que esta es una muy buena solución, pero es posible de todos modos.
¿Qué tipo de código espera 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 a fondo 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 para una clase, y luego usar ese objeto para manipular un objeto en particular.
Enlace: Método PropertyInfo.SetValue
fuente
GetMethod(methodName)
en su lugar, analizar los valores de los parámetros y llamar al método usando la reflexión.Usando la API de scripting de Roslyn (más ejemplos aquí ):
También puede ejecutar cualquier fragmento de código:
Y haga referencia al código que se generó en ejecuciones anteriores:
fuente
Realmente no. Puede usar la reflexión para lograr lo que desea, pero no será tan simple como en Javascript. Por ejemplo, si desea establecer el campo privado de un objeto en algo, puede usar esta función:
fuente
Esta es una función eval en c #. Lo usé para convertir funciones anónimas (Expresiones Lambda) de una cadena. Fuente: http://www.codeproject.com/KB/cs/evalcscode.aspx
fuente
Escribí un proyecto de código abierto, Dynamic Expresso , que puede convertir expresiones de texto escritas con una sintaxis de C # en delegados (o árbol de expresiones). Las expresiones se analizan y transforman en árboles de expresión sin utilizar la compilación o la reflexión.
Puedes escribir algo como:
o
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 .
fuente
Todo eso definitivamente funcionaría. Personalmente, para ese problema en particular, probablemente adoptaría un enfoque un poco diferente. Quizás algo como esto:
Al usar patrones como este, debe tener cuidado de que sus datos se almacenen por referencia y no por valor. En otras palabras, no hagas esto con primitivas. Tienes que usar sus grandes contrapartes de clase hinchadas.
Me di cuenta de que esa no es exactamente la pregunta, pero la pregunta ha sido bastante bien respondida y pensé que tal vez un enfoque alternativo podría ayudar.
fuente
No lo hago ahora si absolutamente desea ejecutar declaraciones de C #, pero ya puede ejecutar declaraciones de Javascript en C # 2.0. La biblioteca de código abierto Jint puede hacerlo. Es un intérprete de Javascript para .NET. Pase un programa Javascript y se ejecutará dentro de su aplicación. Incluso puede pasar el objeto C # como argumentos y automatizarlo.
Además, si solo desea evaluar la expresión en sus propiedades, pruebe NCalc .
fuente
Puede utilizar la reflexión para obtener la propiedad e invocarla. Algo como esto:
Es decir, asumiendo que el objeto que tiene la propiedad se llama "theObject" :)
fuente
También puede implementar un navegador web y luego cargar un archivo html que contenga javascript.
Luego opta por el
document.InvokeScript
Método en este navegador. El valor de retorno de la función eval se puede capturar y convertir en todo lo que necesita.Hice esto en varios proyectos y funciona perfectamente.
Espero eso ayude
fuente
Podrías hacerlo con una función de prototipo:
y así...
fuente
Utiliza la reflexión para analizar y evaluar una expresión de enlace de datos con un objeto en tiempo de ejecución.
Método DataBinder.Eval
fuente
Escribí un paquete, SharpByte.Dynamic , para simplificar la tarea de compilar y ejecutar código dinámicamente. El código se puede invocar en cualquier objeto de contexto utilizando métodos de extensión como se detalla más aquí .
Por ejemplo,
devuelve 3;
devuelve la representación de cadena del objeto de contexto;
ejecuta esas declaraciones como un script, etc.
Los ejecutables se pueden obtener fácilmente usando un método de fábrica, como se ve en el ejemplo aquí; todo lo que necesita es el código fuente y la lista de los parámetros con nombre esperados (los tokens se incrustan usando la notación de tres corchetes, como {{{0}} }, para evitar colisiones con string.Format () así como sintaxis similares a Handlebars):
Cada objeto ejecutable (script o expresión) es seguro para subprocesos, se puede almacenar y reutilizar, admite el registro desde un script, almacena información de tiempo y la última excepción si se encuentra, etc. También hay un método Copy () compilado en cada uno para permitir crear copias baratas, es decir, utilizar un objeto ejecutable compilado a partir de un script o expresión como plantilla para crear otros.
La sobrecarga de ejecutar una secuencia de comandos o una declaración ya compilada es relativamente baja, muy por debajo de un microsegundo en un hardware modesto, y las secuencias de comandos y expresiones ya compiladas se almacenan en caché para su reutilización.
fuente
Estaba tratando de obtener un valor de un miembro de estructura (clase) por su nombre. La estructura no era dinámica. Todas las respuestas no funcionaron hasta que finalmente las obtuve:
Este método devolverá el valor del miembro por su nombre. Funciona en estructura regular (clase).
fuente
Puede consultar la biblioteca Heleonix.Reflection . Proporciona métodos para obtener / establecer / invocar miembros dinámicamente, incluidos miembros anidados, o si un miembro está claramente definido, puede crear un getter / setter (lambda compilado en un delegado) que es más rápido que la reflexión:
O si el número de propiedades no es infinito, puede generar establecedores y modificarlos (los establecedores son más rápidos ya que son delegados compilados):
Los establecedores pueden ser de tipo,
Action<object, object>
pero las instancias pueden ser diferentes en tiempo de ejecución, por lo que puede crear listas de establecedores.fuente
Desafortunadamente, C # no tiene instalaciones nativas para hacer exactamente lo que está pidiendo.
Sin embargo, mi programa de evaluación C # permite evaluar el código C #. Proporciona la evaluación del código C # en tiempo de ejecución y admite muchas declaraciones de C #. De hecho, este código se puede utilizar en cualquier proyecto .NET, sin embargo, se limita a utilizar la sintaxis de C #. Eche un vistazo a mi sitio web, http://csharp-eval.com , para obtener detalles adicionales.
fuente
la respuesta correcta es que necesita almacenar en caché todos los resultados para mantener bajo el uso de la memoria.
un ejemplo se vería así
y agregarlo a una lista
guarda la identificación y úsala en el código
espero que esto ayude
fuente