Re: Cargar funciones como strings

08/07/2004 - 17:05 por erseco | Informe spam
A mi si que me interesa esa clase, y una pregunta...

¿Es mas rapido ejecutar algo mediante scripting o con un case?

En mi caso tengo un Select Case bastante largo que evalua el valor de
un string, ejemplo:

select case nombre

case "pepe"
tabla = new pepe
case "jose"
tabla = new jose

end select

return tabla

tabla hereda de datatable, asi como pepe y jose (repito que es un
ejemplo)

por eso me interesa lo del script, porque me ahorro el case (que es
inmenso) ya que ejecuto la cadena "jose" para lanzar una nueva
instancia de la tabla jose

gracias!!

Preguntas similare

Leer las respuestas

#1 JM
12/07/2004 - 18:04 | Informe spam
hice la pregunta al principio, debido a que hago algo como
carga controles y eventos desde la BD. Entonces guardo los
comportamientos(eventos) en la BD los cuales quiero
relacionar con otros controles, una especie de libreria en
la BD(de hecho el modelo de BD se me ha hecho complejo),
apreciaria obeservaciones y/o preguntas
-La clase esta que adjuntas, es como un compilador?
-La memoria se veria "muy" afectada de hacerlo como quiero

Muy, muy, muy largo debería ser el Case para ser menos


eficiente que una
solución de ese tipo. Scripting, propiamente dicho, no ha


de ser demasiado
lento, puesto que el código se interpreta, pero no


serviría de nada en tu
caso. Por el contrario la clase que te he dicho, compila


el código, y si
bien lo hace al vuelo y en memoria, siempre es varios


órdenes más lento que
ejecutar unas cuantas sentencias.

No soy nada partidario de generar código en tiempo de


ejecución, puesto que
dificulta el mantenimiento de las aplicaciones. Casi


siempre hay buenas
alternativas. Pero si lo necesitas, te dejo mi clase y


estos ejemplos de
uso:

MsgBox(VBEvaluator.Eval("3 + 3 * (2 + 5)"))

Dim eval As New VBEvaluator()

eval.AddFunction("Sum", "a as integer, b as


integer", "return a + b")
eval.Compile()
MsgBox(eval.EvalFunction("Sum", 2, 3))
MsgBox(eval.EvalFunction("Sum", 12, 23))

Dim codigo As String = _
"Dim i as Integer" & vbCrLf & _
"For i = 1 to n" & vbCrLf & _
"MsgBox(i)" & vbCrLf & _
"Next"
eval.AddSub("Messages", "n as integer", codigo)
eval.ImportsList.Add("Microsoft.VisualBasic.Interaction")
eval.References.Add("Microsoft.VisualBasic.dll")
eval.Compile()
eval.CallSub("Messages", 7)

Juan Carlos Badiola
MVP - C#



Respuesta Responder a este mensaje
#2 Tristan
12/07/2004 - 21:34 | Informe spam
JM, no creo que lo que quieres se deba hacer con compilación al vuelo. Por
lo que has dicho, parece que bastaria con reflection para instanciar las
clases. La asignación de eventos se puede hacer mediante AddHandler. Aunque
es posible desconozca tus necesidades, y si sea necesario VBEvaluator.

-La clase esta que adjuntas, es como un compilador?

Si, es un compilador, en efecto. Pero el compilador está incluido en el
framework. Mi clase tan solo facilita el acceso al mismo.

-La memoria se veria "muy" afectada de hacerlo como quiero

No, no lo creo. Pero si sería la última opción que intentaría.

Juan Carlos Badiola
MVP - C#
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida