C'è un modo per creare dinamicamente un oggetto usando una stringa come nome della classe?Visual Basic: crea dinamicamente oggetti usando una stringa come nome
Sono fuori VB da diversi anni, ma per risolvere un problema in un'altra lingua, sono costretto a sviluppare un wrapper in questo. Ho un metodo factory per creare e restituire dinamicamente un oggetto di un tipo basato sull'input da altrove. L'input fornito è pensato per essere il nome della classe da cui creare un oggetto. La sintassi normale significa che l'intera classe deve essere esplicitamente enunciata. Per farlo in questo modo, ci potrebbe essere letteralmente centinaia di if/then è o casi per gestire tutte le scelte della classe/oggetto disponibili all'interno delle librerie di riferimento:
If c_name = "Button" then obj = new System.Windows.Forms.Button
If c_name = "Form" then obj = new System.Windows.Forms.Form
....
spero invece di ridurre tutta questa gestione a caso una sola riga: IE ...
my_class_name = "whateverclass"
obj = new System.Windows.Forms.my_class_name()
In PHP, questo viene gestito in questo modo ...
$my_class_name = "whateverclass";
$obj = new $my_class_name();
Edit: Guardando alcune delle risposte , Penso di essere sopra la mia testa qui. Sono riuscito a farlo funzionare con this CreateInstance metodo di variazione della classe dell'Assemblea, anche se io sono più interessato a this variation giving more options, tra cui la fornitura di costruire parametri ...
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)
In altre parole, ci vuole un metodo per fare questo, e nessuna sintassi del linguaggio inerente? This Activator variation ha funzionato anche quando viene utilizzata la stringa di assemblaggio completa e il percorso di classe. Sono sospettoso che CreateInstance potrebbe non avere la piena capacità di lasciarmi trattare gli oggetti come se fossero chiamati normalmente, ovvero obj = new System.Windows.Forms.Button
. Questo è il motivo per cui non posso usare semplicemente CreateObject
. Se non esiste una funzione di linguaggio naturale che ti permetta di sostituire un nome di classe per una stringa, qualcuno ha qualche idea in che tipo di limitazioni posso aspettarmi dall'uso di CreateInstance
?
Inoltre, c'è anche una differenza tra i metodi di base Activator.CreateInstance (dopo Unwrap) e Assembly.CreateInstance?
Bello. 'Form1_Load()' sarà effettivamente gestito tramite un'altra lingua per me tramite COM. La riga 'o = Assembly.Load (ay) .CreateInstance (fullyQualifiedClassName)' dovrebbe farlo. –