2009-01-29 11 views
32

J'ai une variable de chaîne qui représente le nom d'une classe personnalisée. Exemple:Conversion d'une chaîne en nom de classe

string s = "Customer"; 

Je devrai créer une liste de clients. Ainsi, la syntaxe est nécessaire:

List<Customer> cust = new .. 

Comment puis-je convertir pour être en mesure de créer de la chaîne cette arraylist sur l'exécution?

+0

John, il n'y a pas d'implémentation générique de la classe ArrayList dans le framework .NET. Bob, c'est hors de question pour la question, mais si vous programmez en C# 2.0+, vous devriez remplacer ArrayList par quelque chose de générique. – senfo

Répondre

55

Eh bien, d'une part, ArrayList n'est pas générique ... vouliez-vous dire List<Customer>?

Vous pouvez utiliser Type.GetType(string) pour obtenir l'objet Type associé à un type par son nom. Si l'assembly n'est pas mscorlib ou le type en cours d'exécution, vous devez inclure le nom de l'assembly. De toute façon, vous aurez besoin de l'espace de noms aussi. Etes-vous sûr d'avoir vraiment besoin d'un type générique? Les génériques fournissent principalement la sécurité de type à la compilation, ce qui ne vous sera certainement pas très utile si vous trouvez le type au moment de l'exécution. Vous pouvez trouver utile si ...

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

object list = Activator.CreateInstance(listType); 

Si vous devez faire quelque chose avec cette liste, vous pouvez bien besoin de faire une réflexion plus générique mais ... par exemple appeler une méthode générique.

+0

Comment convertir un objet en type concret? J'ai essayé d'utiliser List concreteType mais cela ne fonctionne pas? – KingOfHypocrites

+0

@KingOfHypocrites: Le type de l'objet lui-même * est * le bon type. Le type de * variable * ne peut pas l'être, car vous ne le savez pas à la compilation. –

+0

@JonSkeet J'ai recherché et recherché. Existe-t-il un moyen de faire cela en appelant une méthode générique? En d'autres termes, au lieu de devoir remplir un objet 'List ', que se passe-t-il si vous devez appeler une méthode' MyMethod () '? – RLH

10

Ceci est une question de réflexion. Vous devez trouver le type instanciez une instance de celui-ci, quelque chose comme ceci:

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

ou, CreateInstance (assemblyName, className)

Vous aurez besoin de regarder pour des affrontements namespace/de type bien, mais cela fera l'affaire pour un scénario simple.

Aussi, enveloppez cela dans un try/catch! Activator.CreateInstance est effrayant!

Questions connexes