2009-01-29 13 views
32

Ich habe eine Zeichenfolgenvariable, die den Namen einer benutzerdefinierten Klasse darstellt. Beispiel:Konvertieren einer Zeichenfolge in einen Klassennamen

string s = "Customer"; 

Ich muss eine Arraylist von Kunden erstellen. So ist die Syntax erforderlich ist:

List<Customer> cust = new .. 

Wie konvertiere ich die Zeichenfolge s Lage sein, diese Arraylist zur Laufzeit zu erstellen?

+0

John, es gibt keine generische Implementierung der ArrayList-Klasse im .NET-Framework. Bob, das ist nicht der Fall für die Frage, aber wenn Sie in C# 2.0+ programmieren, sollten Sie die ArrayList für etwas Generisches ersetzen. – senfo

Antwort

55

Nun, für eine Sache ArrayList ist nicht generisch ... meinst du List<Customer>?

Sie können Type.GetType(string) verwenden, um das Objekt Type zu erhalten, das einem Typ durch seinen Namen zugeordnet ist. Wenn die Assembly weder mscorlib noch der aktuell ausgeführte Typ ist, müssen Sie den Assemblynamen angeben. In beiden Fällen benötigen Sie auch den Namensraum.

Sind Sie sicher, dass Sie wirklich einen generischen Typ benötigen? Generika bieten meist Kompilierzeit Typ Sicherheit, die Sie nicht viel haben werden, wenn Sie den Typ zur Ausführungszeit finden. obwohl Sie kann es nützlich finden ...

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

object list = Activator.CreateInstance(listType); 

Wenn Sie benötigen etwas mit dieser Liste tun, können Sie auch wenn allgemeinere Reflexion tun müssen, ... z eine generische Methode aufrufen.

+0

Wie würden Sie das Objekt in den Betontyp umwandeln? Ich habe versucht, List concreteType, aber das funktioniert nicht? – KingOfHypocrites

+0

@KingOfHypocrites: Der Typ des Objekts selbst * ist * der richtige Typ. Der Typ der * Variablen * kann nicht sein, weil Sie das zur Kompilierzeit nicht wissen. –

+0

@JonSkeet Ich habe gesucht und gesucht. Gibt es eine Möglichkeit, dies beim Aufruf einer generischen Methode zu tun? Mit anderen Worten, anstatt ein 'List ' Objekt zu füllen, was ist, wenn Sie eine 'MyMethod ()' Methode aufrufen müssen? – RLH

10

Dies ist eine Reflexionsfrage. Sie müssen den Typ dann instanziiert eine Instanz davon, so etwas finden:

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

oder CreateInstance (assembly, classname)

Sie müssen allerdings für Namespace/Typ Auseinandersetzungen achten, aber das wird den Trick für ein einfaches Szenario tun.

Auch, wickeln Sie das in einem Versuch/fangen! Activator.CreateInstance ist gruselig!

Verwandte Themen