Ok, ho scommesso su questa idea tutto il giorno ora, e ho raggiunto la parte in cui ammetto che non riesco a capire. È possibile che quello che sto facendo sia semplicemente stupido e che ci sia un modo migliore, ma è qui che mi ha portato il mio modo di pensare.Come si può trasmettere a un tipo usando il nome del tipo come stringa?
Sto tentando di usare un metodo generico per caricare moduli in WinForms:
protected void LoadForm<T>(ref T formToShow, bool autoLoaded) where T : FormWithWorker, new()
{
// Do some stuff
}
Le forme vengono caricati da un ToolStripMenuItem (sia attraverso la selezione della voce o tramite la voce di menu Apri Windows). Sono pigri, quindi ci sono campi per i moduli all'interno del genitore MDI, ma sono nulli finché non sono necessari. Ho un metodo comune utilizzato per ToolStripMenuItem_Click che gestisce tutti i clic delle voci di menu. Il metodo non ha un modo reale di sapere quale modulo viene chiamato, tranne per il fatto che il nome di ToolStripMenuItem corrisponde a un modello scelto per i nomi delle classi di moduli a cui corrispondono. Quindi, usando il nome di ToolStripMenuItem, posso indovinare il nome del tipo di modulo richiesto e il nome del campo privato assegnato per memorizzare il riferimento per quel modulo.
Utilizzando ciò, è possibile utilizzare un'istruzione switch crescente/di contratto con tipi hard-coded e corrispondenze di stringa per chiamare il metodo con il tipo specifico set (indesiderabile) oppure utilizzare Reflection per ottenere il campo e creare l'istanza del tipo Il problema per me è, System.Activator.CreateInstance
fornisce un ObjectHandler che non può essere trasmesso ai tipi di cui ho bisogno. Ecco un frammento di ciò che ho finora:
string formName = "_form" + ((ToolStripMenuItem)sender).Name.Replace("ToolStripMenuItem", "");
string formType = formName.Substring(1);
FieldInfo fi = this.GetType().GetField(formName, BindingFlags.NonPublic | BindingFlags.Instance);
FormWithWorker formToLoad = (FormWithWorker)fi.GetValue(this);
if (formToLoad == null)
{
formToLoad = (????)System.Activator.CreateInstance("MyAssemblyName", formType);
}
this.LoadForm(ref formToLoad, false);
fi.SetValue(this, formToLoad);
so il nome della stringa del tipo che va in per (????), ma al momento della compilazione non so il tipo perché cambia . Ho provato un sacco di modi per far funzionare questo cast/istanza, ma nessuno ha avuto successo. Mi piacerebbe molto sapere se è possibile eseguire un cast di questo tipo conoscendo il tipo solo come una stringa. Ho provato a usare Type.GetType(string, string)
per eseguire il cast, ma al compilatore non piaceva. Se qualcuno ha un'idea diversa su come caricare dinamicamente i moduli perché sto semplicemente facendo stupidamente, per favore fatemelo sapere.
rendere formToLoad oggetto e trasmetterlo a FormWithWorker nei punti LoadForm e SetValue? – asawyer