C#: Instanciar sin conocer los parametros

P

Buenas.Llevo un buen rato intentando instanciar una clase de la que no conozco su constructor en tiempo de compilacion.Con las clases de Reflection consigo uno de sus posibles constructores y los tipos de los parametros que usa el constructor y sus valores por defecto.Con todos estos datos no consigo instanciar la clase.

ConstructorInfo[] ctrinfo = tipo.GetConstructors();
ParameterInfo[] parinfo = ctrinfo[0].GetParameters();
object[] parametros = new object[parinfo.Length];

for (int k = 0; k < parametros.Length; k++)
parametros[k] = parinfo[k].ParameterType;

item = ctrinfo[0].Invoke(parametros);

Cambiando ParameterType por DefaultValue tampoco lo consigo.¿alguna idea?

P

Bueno al final lo he hecho instanciando cada uno de los parametros a partir de su tipo y mandando estas instancias al constructor.Me parece una manera muy sucia de hacerlo , si a alguien se le ocurre alguna mejor por favor que lo diga :D.

SeiYa

Explícate más para que lo necesitas y danos más datos :P

Porque así, sin más la respuesta que te podría dar es que creases un constructor que reciba el mitico array de parámetros cuando no sabes que quieres recibir pero creo que te refieres a instanciar una clase que no conoces en tiempo de ejecución y detectar sus parámetros ...

Así que si nos dices todo mejor :P

P

Bueno para lo que lo queria es un poco largo de explicar.Te pongo un ejemplo corto que requeriria lo mismo.
Imaginate que tienes un ensamblado con unas mm 700.000.000 de clases tirando por lo bajo xd, y quieres hacer una instancia de cada clase.Supon ademas que no todas las clases tienen un constructor por defecto (vamos, que no se pueden instanciar simplemente con Activator.CreateInstance( tipo de la clase)), si no que implementan constructores con varios parametros y ninguno sin parametros.¿como lo harias?.

kas

La mejor opcion es obligar a que tengan un constructor vacio y luego copiar sus campos 1 a 1.

C myClass = new C();
...
// Crear la instancia con el constructor vacio
C newClass = (C) Activator.CreateInstance(C.GetType());

// Copiar campos.

Busca informacion sobre el FieldInfo, y las BindingFlags, para hacer un bucle paseandote por myClass.Fields (obviamente esta no es la signatura correcta, pero ya lo entiendes) para copiar los fields a newClass.

Esta tecnica tiene el problea de que no puede copiar matrizes.

Usuarios habituales