Creación de un objeto en tiempo de ejecución

25/02/2006 - 21:33 por LuisFran | Informe spam
No sé si lo que voy a plantear es una locura o no, o si se puede hacer.
Me gustaría definir una propiedad cuyo contenido fuese un tipo de objeto

permitido, por ejemplo System.Object o cualquier otro.

De forma que cuando este en ejecución pudiera crear un objeto en función
del tipo especificado en esa propiedad.

Es decir, en lugar de hacer new System.Object(); seria posible hacer
new this.TipoObjeto()

Saludos,

Preguntas similare

Leer las respuestas

#1 Octavio Hernandez
26/02/2006 - 00:56 | Informe spam
Luis,

Puedes definir en tu clase una propiedad de tipo System.Type, y en ella
almacenarías el tipo del objeto a crear. Por ejemplo:

System.Type tipo = typeof(System.String);

Lo incómodo es que todo el trabajo tendrías que hacerlo mediante reflexión,
desde el mismo hecho de crear un objeto de ese tipo (mira el método
Activator.CreateInstance()).

Slds - Octavio


"LuisFran" escribió en el mensaje
news:
No sé si lo que voy a plantear es una locura o no, o si se puede hacer.
Me gustaría definir una propiedad cuyo contenido fuese un tipo de objeto
permitido, por ejemplo System.Object o cualquier otro.

De forma que cuando este en ejecución pudiera crear un objeto en función
del tipo especificado en esa propiedad.

Es decir, en lugar de hacer new System.Object(); seria posible hacer
new this.TipoObjeto()

Saludos,

Respuesta Responder a este mensaje
#2 LuisFran
26/02/2006 - 21:12 | Informe spam
Muchas gracias, Octavio:

Aún no me aclaro mucho con el tema de reflexion, pero sin embargo
typeof() me devuelve un objeto de la clase type que es el tipo que le
indicamos entre paréntesis. Sin embargo, lo que yo pretendo es tener un
una propiedad de tipo string el nombre de una clase, que luego quiero
instanciar como un objeto. Como dice con Activator.CreateInstance()
puedo instanciar un objeto, pero me devuelve un manejador de objeto
(objecthandle) ¿? y no un objeto del tipo que quiero.

Puedes orientarme un poco más, sigo bastante perdido con este tema.

Gracias de nuevo.
Luis

Octavio Hernandez escribió:
Luis,

Puedes definir en tu clase una propiedad de tipo System.Type, y en ella
almacenarías el tipo del objeto a crear. Por ejemplo:

System.Type tipo = typeof(System.String);

Lo incómodo es que todo el trabajo tendrías que hacerlo mediante reflexión,
desde el mismo hecho de crear un objeto de ese tipo (mira el método
Activator.CreateInstance()).

Slds - Octavio


"LuisFran" escribió en el mensaje
news:
No sé si lo que voy a plantear es una locura o no, o si se puede hacer.
Me gustaría definir una propiedad cuyo contenido fuese un tipo de objeto
permitido, por ejemplo System.Object o cualquier otro.

De forma que cuando este en ejecución pudiera crear un objeto en función
del tipo especificado en esa propiedad.

Es decir, en lugar de hacer new System.Object(); seria posible hacer
new this.TipoObjeto()

Saludos,






Respuesta Responder a este mensaje
#3 Octavio Hernandez
26/02/2006 - 23:18 | Informe spam
Hola Luis,

a) Tanto el operador typeof (que se aplica a un tipo) como el método
Object.GetType(), que puede aplicarse a cualquier objeto, devuelven un
objeto del tipo System.Type. System.Type tiene propiedades Name y FullName,
que te dan una cadena de caracteres con el nombre del tipo, así que si
quieres puedes guardar el nombre del tipo en una propiedad de tipo String
sin problemas. Simplemente utilizar el tipo es más directo.

b) Efectivamente, CreateInstance devuelve un Object, pero esta es sólo su
declaración estática. En realidad crea una instancia del tipo que tú le
especifiques. Lo que pasa es que la declaración es 'Object' porque a priori
no se sabe qué tipo le vas tú a pasar, ¿ok?. Tú luego puedes indicar
explícitamente la conversión al tipo que te interesa. Por ejemplo:

string miCadena = (string) Activar.CreateInstance( typeof(string) );

Estoy utilizando concreatmente de esta variante:

[C#]
public static object CreateInstance(
Type type
);

(http://msdn.microsoft.com/library/d...topic1.asp)

aunque verás que también hay una variante a la que le puedes pasar una
cadena con el nombre del tipo .

Slds - Octavio



"LuisFran" escribió en el mensaje
news:
Muchas gracias, Octavio:

Aún no me aclaro mucho con el tema de reflexion, pero sin embargo typeof()
me devuelve un objeto de la clase type que es el tipo que le indicamos
entre paréntesis. Sin embargo, lo que yo pretendo es tener un una
propiedad de tipo string el nombre de una clase, que luego quiero
instanciar como un objeto. Como dice con Activator.CreateInstance() puedo
instanciar un objeto, pero me devuelve un manejador de objeto
(objecthandle) ¿? y no un objeto del tipo que quiero.

Puedes orientarme un poco más, sigo bastante perdido con este tema.

Gracias de nuevo.
Luis

Octavio Hernandez escribió:
Luis,

Puedes definir en tu clase una propiedad de tipo System.Type, y en ella
almacenarías el tipo del objeto a crear. Por ejemplo:

System.Type tipo = typeof(System.String);

Lo incómodo es que todo el trabajo tendrías que hacerlo mediante
reflexión, desde el mismo hecho de crear un objeto de ese tipo (mira el
método Activator.CreateInstance()).

Slds - Octavio


"LuisFran" escribió en el mensaje
news:
No sé si lo que voy a plantear es una locura o no, o si se puede hacer.
Me gustaría definir una propiedad cuyo contenido fuese un tipo de objeto
permitido, por ejemplo System.Object o cualquier otro.

De forma que cuando este en ejecución pudiera crear un objeto en función
del tipo especificado en esa propiedad.

Es decir, en lugar de hacer new System.Object(); seria posible hacer
new this.TipoObjeto()

Saludos,









Respuesta Responder a este mensaje
#4 Eduardo A. Morcillo [MS MVP VB]
27/02/2006 - 07:28 | Informe spam
Usa Type.GetType para obtener el objeto Type desde el nombre de la clase y
luego Activator.CreateInstance:

Type t = Type.GetType("MiNamespace.MiTipo")
object o = Activator.CreateInstance(t);

Si el ensamblado en que esta la clase no esta cargado agregalo al nombre del
tipo:

Type t = Type.GetType("MiNamespace.MiTipo, MiEnsamblado")

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
http://mvp.support.microsoft.com/pr...4EF5A4191C
Respuesta Responder a este mensaje
#5 LuisFran
08/03/2006 - 21:15 | Informe spam
Eduardo A. Morcillo [MS MVP VB] escribió:
Usa Type.GetType para obtener el objeto Type desde el nombre de la clase y
luego Activator.CreateInstance:

Type t = Type.GetType("MiNamespace.MiTipo")
object o = Activator.CreateInstance(t);

Si el ensamblado en que esta la clase no esta cargado agregalo al nombre del
tipo:

Type t = Type.GetType("MiNamespace.MiTipo, MiEnsamblado")



Debido a que he tenido lio, no he podido dar las gracias por la ayuda.
Gracias a Octavio y Eduardo, con vuestra ayuda ha sido posible encontrar
mi solución.

Hasta pronto,
LuisFran
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida