2009-01-29 11 views
32

Tengo una variable de cadena que representa el nombre de una clase personalizada. Ejemplo:Convirtiendo una cadena a un nombre de clase

string s = "Customer"; 

Necesitaré crear un arraylist de clientes. Por lo tanto, la sintaxis necesaria es:

List<Customer> cust = new .. 

¿Cómo convierto la cadena s de ser capaz de crear este ArrayList en tiempo de ejecución?

+0

John, no existe una implementación genérica de la clase ArrayList en .NET framework. Bob, esto está fuera del alcance de la pregunta, pero si estás programando en C# 2.0+, debes sustituir ArrayList por algo genérico. – senfo

Respuesta

55

Bueno, por un lado ArrayList no es genérico ... ¿quiso decir List<Customer>?

Puede usar Type.GetType(string) para obtener el objeto Type asociado a un tipo por su nombre. Si el ensamblado no es ni mscorlib ni el tipo actualmente en ejecución, deberá incluir el nombre del ensamblado. De cualquier manera, necesitarás el espacio de nombres también.

¿Estás seguro de que realmente necesitas un tipo genérico? Los genéricos en su mayoría proporcionan en tiempo de compilación tipo de seguridad, que claramente no tendrá mucha si encuentra el tipo en tiempo de ejecución. Usted puede que le resulte útil, aunque ...

Type elementType = Type.GetType("Customer"); 
Type listType = typeof(List<>).MakeGenericType(new Type[] { elementType }); 

object list = Activator.CreateInstance(listType); 

Si necesita hacer nada con esa lista, es posible que también tenga que hacer una reflexión más genérica, aunque ... por ejemplo, para llamar a un método genérico.

+0

¿Cómo conseguirías un objeto convertido al tipo concreto? He intentado usar List concreteType pero esto no funciona? – KingOfHypocrites

+0

@KingOfHypocrites: el tipo del objeto * es * el tipo correcto. El tipo de * variable * no puede ser, porque no lo sabe en tiempo de compilación. –

+0

@JonSkeet He buscado y buscado. ¿Hay alguna manera de hacer esto cuando se llama a un método genérico? En otras palabras, en lugar de tener que completar un objeto 'List ', ¿qué sucede si necesita llamar a un método 'MyMethod ()'? – RLH

10

Esta es una pregunta de reflexión. Es necesario encontrar el tipo y luego crear una instancia de ella, algo como esto:

Type hai = Type.GetType(classString,true); 
Object o = (Activator.CreateInstance(hai)); //Or you could cast here if you already knew the type somehow 

o, CreateInstance (assemblyName, className)

Tendrá que tener cuidado con los enfrentamientos espacio de nombre/tipo embargo, pero eso hará el truco para un escenario simple.

¡También, envuélvalo en una trampa/captura! Activator.CreateInstance es aterrador!

Cuestiones relacionadas