Gibt es eine Möglichkeit, ein Objekt dynamisch zu erstellen, indem Sie eine Zeichenfolge als Klassennamen verwenden?Visual Basic: Objekte dynamisch mithilfe einer Zeichenfolge als Name erstellen
Ich bin seit einigen Jahren aus VB, aber um ein Problem in einer anderen Sprache zu lösen, bin ich gezwungen, einen Wrapper in diesem zu entwickeln. Ich habe eine Factory-Methode zum dynamischen Erstellen und Zurückgeben eines Objekts eines Typs basierend auf Eingaben von woanders. Die angegebene Eingabe ist der Klassenname, aus dem ein Objekt erstellt werden soll. Normale Syntax bedeutet, dass die gesamte Klasse explizit buchstabiert werden muss. Um es auf diese Art und Weise zu tun, könnte es buchstäblich Hunderte von if/then ist oder Fälle zu behandeln alle verfügbaren Klasse/Objekt Auswahl innerhalb der referenzierten Libs:
If c_name = "Button" then obj = new System.Windows.Forms.Button
If c_name = "Form" then obj = new System.Windows.Forms.Form
....
Ich hoffe, anstatt all diesen Fall zu reduzieren Transporters eine einzige Zeile: IE ...
my_class_name = "whateverclass"
obj = new System.Windows.Forms.my_class_name()
In PHP wird dies wie so behandelt ...
$my_class_name = "whateverclass";
$obj = new $my_class_name();
Edit: auf einige der Antworten der Suche Ich denke, ich bin hier über meinen Kopf hinweg. Ich habe es geschafft, um es mit this CreateInstance Methode Variation der Assembly-Klasse arbeiten, obwohl ich in this variation giving more options mehr daran interessiert bin, einschließlich Parameter liefert konstruieren ...
my_type_name = "System.Windows.Forms.Button"
asmb_name = "System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
button1 = Reflection.Assembly.Load(asmb_name).CreateInstance(my_type_name)
Mit anderen Worten, es braucht eine Methode zu tun Dies und keine inhärente Sprachsyntax? This Activator variation funktionierte auch, wenn der vollständige Assembly-String und Klassenpfad verwendet wird. Ich bin misstrauisch CreateInstance hat möglicherweise nicht die volle Fähigkeit, Objekte so zu behandeln, als wären sie normal aufgerufen worden, zB obj = new System.Windows.Forms.Button
. Deshalb kann ich nicht einfach CreateObject
verwenden. Wenn es keine natürliche Sprachfunktion gibt, mit der Sie einen Klassennamen für eine Zeichenfolge ersetzen können, hat irgendjemand einen Einblick, welche Art von Einschränkungen ich von der Verwendung von CreateInstance
erwarten kann?
Gibt es auch einen Unterschied zwischen grundlegenden Activator.CreateInstance (nach dem Unwrap) und Assembly.CreateInstance Methoden?
Schön. 'Form1_Load()' wird tatsächlich über eine andere Sprache für mich über COM abgewickelt. Die Zeile 'o = Assembly.Load (ay) .CreateInstance (fullyQualifiedClassName)' sollte es tun. –