Generar código en tiempo de ejecución

14/11/2005 - 18:56 por José Luis | Informe spam
Hola a todos.

Tengo una aplicación que carga su configuración a partir de un fichero XML,
pero quiero mejorar un poco el sistema y hacerlo algo más inteligente de la
siguiente manera:
- Leo del archivo XML el nombre de determinados controles que estarán
definidos en el formulario.
- Para cada uno de estos controles, leo los nombres de las propiedades
que quiero modificar
- Para cada una de las propiedades, leo su valor.

Un ejemplo de archivo XML

<control Type="TextBox" Name="tbNombre">
<property Name="Text" Type="string" Value="Hola Mundo"></property>
<property Name="Visible" Type="bool" Value="true"></property>
</control>

Mi código C#, a partir de este XML monta las siguientes instrucciones
C#:

TextBox tbNombre; //Definido en el diseño del formulario
[...]
tbNombre.Text="Hola Mundo";
tbNombre.Visible=true;

Pero... ¿Existe alguna manera de que pueda ejecutar este código de
manera dinámica?¿Puedo hacer esto con reflection?¿Cómo?¿Teniendo en cuenta
que se tiene que ejecutar interactuando con los objetos de mi entorno de
ejecución actual?


Necesito vuestra ayuda.
Gracias

Preguntas similare

Leer las respuestas

#1 A.Poblacion
15/11/2005 - 08:36 | Informe spam
"José Luis" wrote in message
news:
[...]
Mi código C#, a partir de este XML monta las siguientes instrucciones
C#:

TextBox tbNombre; //Definido en el diseño del formulario
[...]
tbNombre.Text="Hola Mundo";
tbNombre.Visible=true;

Pero... ¿Existe alguna manera de que pueda ejecutar este código de
manera dinámica?¿Puedo hacer esto con reflection?¿Cómo?¿Teniendo en cuenta
que se tiene que ejecutar interactuando con los objetos de mi entorno de
ejecución actual?



Se puede hacer con reflexión, pero probablemente no te haga falta. Si el
número de controles que usas es limitado (por ejemplo, si solo tienes
textboxes y labels) solo tienes que hacer los "new" dentro de un bucle,
asignarles propiedades, y agregar los nuevos controles a la colección
Controls del Form:

while (leer_control_del_xml)
{
switch (tipo_de_control)
{
case "TextBox":
TextBox t = new TextBox();
t.Text = Valor_leido_del_xml;
...(otras propiedades)...
this.Controls.Add(t);
break;
casel "Label";
Label l = new Label();
l.Text = Valor_leido_del_xml;
...
this.Controls.Add(l);
break;
}
}
Respuesta Responder a este mensaje
#2 José Luis
15/11/2005 - 09:18 | Informe spam
Me gustaría que me orientárais para hacerlo con reflection, ya que los tipos
de los controles en un principio son indeterminados y las propiedades de los
mismos también lo son.


Gracias

Se puede hacer con reflexión, pero probablemente no te haga falta. Si
el
número de controles que usas es limitado (por ejemplo, si solo tienes
textboxes y labels) solo tienes que hacer los "new" dentro de un bucle,
asignarles propiedades, y agregar los nuevos controles a la colección
Controls del Form:

while (leer_control_del_xml)
{
switch (tipo_de_control)
{
case "TextBox":
TextBox t = new TextBox();
t.Text = Valor_leido_del_xml;
...(otras propiedades)...
this.Controls.Add(t);
break;
casel "Label";
Label l = new Label();
l.Text = Valor_leido_del_xml;
...
this.Controls.Add(l);
break;
}
}


Respuesta Responder a este mensaje
#3 Miguel Angel Campos
15/11/2005 - 09:32 | Informe spam
Hola José Luis,

lo que quieres hacer es lo mismo que hará en un futuro Avalon, la nueva
infraestructura de Microsoft para la creación de entornos window.
Actualmente existen algunos productos comerciales que permiten llevar a cabo
este trabajo con muchas posibilidades y con resultados buenos, aunque con
algunas limitaciones. En la siguiente pagina tienes bastante información:
http://www.xaml.net/

Pero tambien puedes utilizar una pequeña, muy pequeña, libreria que creo
Marc Clifton y que publicó en CodeProject:
http://www.codeproject.com/dotnet/MycroXaml.asp
Esta persona tiene creada otra versión mucho mas completa pero bajo licencia
GPL:
http://www.myxaml.com/

Espero que te sirva toda esta información, y si tienes alguna duda...

Un Saludo,

Miguel Angel Campos
MCAD.NET

"José Luis" escribió en el mensaje
news:
Hola a todos.

Tengo una aplicación que carga su configuración a partir de un fichero
XML, pero quiero mejorar un poco el sistema y hacerlo algo más inteligente
de la siguiente manera:
- Leo del archivo XML el nombre de determinados controles que estarán
definidos en el formulario.
- Para cada uno de estos controles, leo los nombres de las propiedades
que quiero modificar
- Para cada una de las propiedades, leo su valor.

Un ejemplo de archivo XML

<control Type="TextBox" Name="tbNombre">
<property Name="Text" Type="string" Value="Hola Mundo"></property>
<property Name="Visible" Type="bool" Value="true"></property>
</control>

Mi código C#, a partir de este XML monta las siguientes instrucciones
C#:

TextBox tbNombre; //Definido en el diseño del formulario
[...]
tbNombre.Text="Hola Mundo";
tbNombre.Visible=true;

Pero... ¿Existe alguna manera de que pueda ejecutar este código de
manera dinámica?¿Puedo hacer esto con reflection?¿Cómo?¿Teniendo en cuenta
que se tiene que ejecutar interactuando con los objetos de mi entorno de
ejecución actual?


Necesito vuestra ayuda.
Gracias

Respuesta Responder a este mensaje
#4 tatis
16/11/2005 - 14:38 | Informe spam
Este fragmento de código puede darte una idea de como hacerlo. En la
ayuda hay bastante documentación al respecto de Reflexión.

//Colocarlo en un formulario de Windows
Type t = typeof(TextBox);
Assembly a = Assembly.GetAssembly(t);
TextBox txt = (TextBox) a.CreateInstance(t.FullName);
this.Controls.Add(txt);
txt.Visible = true;
Respuesta Responder a este mensaje
#5 José Luis
22/11/2005 - 12:18 | Informe spam
No es esa la idea, los objetos ya están creados. Lo único que quiero es
modificar las propiedades de los mismos partiendo de un archivo de
configuración XML, y no quiero predefinir todas las posibles propiedades de
los campos... sería un horror hacer eso.

Lo que quiero es que si tengo un label con el texto "hola", poder
configurarlo desde el XML para que ponga "Hola", y que el fondo sea rojo, y
que la letra sea xxxx...

Esto me daría mucha versatilidad en entornos multiusuario, ya que me
permitiría modificar independientemente, por usuario, el comportamiento de
los distintos formularios de la aplicación

"tatis" escribió en el mensaje
news:
Este fragmento de código puede darte una idea de como hacerlo. En la
ayuda hay bastante documentación al respecto de Reflexión.

//Colocarlo en un formulario de Windows
Type t = typeof(TextBox);
Assembly a = Assembly.GetAssembly(t);
TextBox txt = (TextBox) a.CreateInstance(t.FullName);
this.Controls.Add(txt);
txt.Visible = true;
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida