Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Creando Un Objeto Con Type

Iniciado por BeRSeRKeR, 07 de Diciembre de 2004, 11:59:00 AM

« anterior - próximo »

BeRSeRKeR

 Hola.

En C#, ¿se puede crear un objeto únicamente conociendo su tipo (Type)?. Algo como esto:

Type T = assembly.GetType("CualquierClase", true, true);
Object obj = new T();


Ya sé que eso no funciona pero es para aclararos qué es lo que quiero hacer.

Gracias.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Vicente

 Hola,

creo que quieres esto no?

object Activator.CreateInstance(Type type)

Con eso creas un objeto a partir de su tipo. Un saludo!

Vicente

P.D.: para que funcione tienes que tener un constructor vacio.

BeRSeRKeR

 ¡Muchísimas gracias Vicente, funciona como era de esperar!.

Os cuento. Resulta que Haddd y yo estábamos viendo la forma de crear materiales para el motor. Haddd defiende la idea de que aquel que quiera crear materiales nuevos para el motor tiene que crear los materiales utilizando el Visual C# y compilarlos dentro del propio motor. Yo por otro lado pienso en un sistema en el que el desarrollador (que no tiene por qué ser un programador, sino por ejemplo un grafista) pueda coger un editor de texto (digamos UltraEdit) y crearse su propia clase de material que deriva de una clase (BaseMaterial, que sí está definida en el nucleo del motor) e implementar una interface común. De esa forma podríamos estar ejecutando el juego y por otro lado modificando un material concreto y hecho eso, en la consola del juego escribir refreshMaterials y automáticamente y sin recompilar el motor entero (solo los materiales), conseguir que se reflejen los cambios en el motor en tiempo real. Lo mismo podría hacerse con la IA, la lógica de los mapas (puzles, etc), etc. De todas formas de la forma que digo también se podrían crear librerías de materiales precompiladas (en dlls).

Así que me he creado un pequeño ejemplo donde tengo una clase base BaseMaterial y otra que deriva de BaseMaterial y que se compila en tiempo de ejecución. Así que el problema es que no sabía cómo crear un objeto de una clase que no estaba definida dentro del entorno de programación y de la cual sólo conocía el tipo, pero el método que me has dicho funciona perfectamente.

Pues nada, Haddd y yo seguiremos peleándonos a ver qué método utilizamos finalmente. En cualquier caso está bien saber esto porque como he dicho, para definir la IA de los personajes y oras muchas cosas tendremos que utilizar C# como lenguaje de scripting.

Gracias.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Vicente

 Hola,

nosotros en el trabajo usamos muchisimo todo lo que es el tema de reflection en .net, y funciona muy pero que muy bien. Yo también sería partidario de permitir cargar tipos en tiempo de ejecución gracias a reflection, da una flexibilidad muy grande (lo que no se es cual es el coste de rendimientos, habría que indagar un poco...). Un saludo!

Vicente

Grugnorr

 "Mucho". Pero si es para instanciar la clase en la fase de carga y no en el bucle principal, es un lujo de flexibilidad.

hat the hells!

BeRSeRKeR

 
Cita de: "Grugnorr""Mucho". Pero si es para instanciar la clase en la fase de carga y no en el bucle principal, es un lujo de flexibilidad.
Exacto, la compilación se produce al cargar el motor y se crea una instancia del material que se inserta en la lista de materiales. A partir de ahí se trata como si fuera un objeto normal y corriente por lo que no debería existir penalización durante el resto de la ejecución del motor.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.