2016-06-28 11 views
1

Ich versuche, Instanzen von Klassen mit String-Namen zu erstellen. Ich erstelle Dienstprogramm, wo Benutzer Typ aus dem Popup-Feld der Zeichenfolge (Inhalt dieses Feldes ist Inhalt der Feld "Typen") und ich muss Instanz der Klasse basierend auf seiner Wahl zu erstellen. Leider weiß ich nicht, wie man es machtInstanz für Zeichenfolge erstellen und zur Sammlung hinzufügen

class Parent 
{ 

} 

class Child1 : Parent 
{ 

} 

class Child2 : Parent 
{ 

} 

string[] types = { "Child1", "Child2" }; 
List<Parent> collection = new List<Parent>(); 

void Main() 
{ 
    Parent newElement = Activator.CreateInstance(this.types[0]) as Parent; // this row is not working :(and I dont know how to make it work 

    this.collection.Add(newElement); 
    if (this.collection[0] is Child1) 
    { 
     Debug.Log("I want this to be true"); 
    } 
    else 
    { 
     Debug.Log("Error"); 
    } 
} 

Ich Finnaly machen es funktioniert. Danke euch allen. Hier arbeitet Code (Problem in fehlenden Namensraum war)

namespace MyNamespace 

{ Klasse Eltern {

} 

class Child1 : Parent 
{ 

} 

class Child2 : Parent 
{ 

} 

class Main 
{ 
    string[] types = { typeof(Child1).ToString(), typeof(Child2).ToString() }; 
    List<Parent> collection = new List<Parent>(); 

    public void Init() 
    { 
     Parent newElement = Activator.CreateInstance(Type.GetType(this.types[0])) as Parent; 

     this.collection.Add(newElement); 
     if (this.collection[0] is Child1) 
     { 
      Debug.Log("I want this to be true"); 
     } 
     else 
     { 
      Debug.Log("Error"); 
     } 
    } 
} 

}

+0

Wenn Sie s ay "diese Zeile funktioniert nicht", können Sie eine bestimmte Art und Weise identifizieren, in der es nicht funktioniert? Kompiliert es nicht, wirft es eine Ausnahme, gibt es null zurück, oder macht es nur das frowny Gesicht, das Sie in Ihrer Frage erwähnen? Haben Sie in MSDN das missmutige Gesicht nachgeschlagen und nachgesehen, ob etwas hilfreich ist? –

+0

Diese Zeile funktioniert nicht vollständig (nicht kompilieren) Ich habe es hier nur zur Veranschaulichung angegeben, was ich versucht habe. Ich habe viel gegoogelt und festgestellt, dass dieses Problem von Activator.CreateInstance gelöst werden kann, aber ich kann es nicht funktionieren lassen. Derzeit suche ich nach völlig neuen Ideen, wie ich mein Problem lösen kann. – MrIncognito

+1

Fügen Sie den 'namespace' in Ihren Code ein, weil Sie das nicht sehen. – muratgu

Antwort

2

Sie benötigen einen Namespace für Ihre Klassen bieten:

string[] types = { "MyApplication.Child1", "MyApplication.Child2" }; 

Dann können Sie eine Instanz erstellen mit dem tatsächlichen Typ:

Parent parent = Activator.CreateInstance(Type.GetType(this.types[0])); 
+0

Ich habe es bereits versucht, aber es gibt mir immer Fehler ArgumentNullException: Argument kann nicht null sein. – MrIncognito

+0

@MrIncognito aktualisieren Sie Ihre Frage mit dem Namespace, den Sie verwendet haben und was auch immer Sie versucht haben. – muratgu

1

Die Activator.CreateInstance Methode findet nicht einen String als Parameter. Sie müssen einen Typ angeben.

Type parentType = Type.GetType(types[0],false); //param 1 is the type name. param 2 means it wont throw an error if the type doesn't exist 

Dann überprüfen, um zu sehen, ob die Art, bevor Sie es gefunden wird

if (parentType != null) 
{ 
    Parent newElement = Activator.CreateInstance(parentType) as Parent; 
}