Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Come caricare dinamicamente un controllo utente dalle risorse del progetto
Forum - C# / VB.NET - Come caricare dinamicamente un controllo utente dalle risorse del progetto

Avatar
XineD (Normal User)
Newbie


Messaggi: 5
Iscritto: 25/11/2014

Segnala al moderatore
Postato alle 16:44
Martedì, 25/11/2014
Salve a tutti

Il mio problema è il seguente, ho un progetto che si chiama myProject, in questo progetto c'è una cartella "controls" che contiene due controlli utente: controlloA.cs e controlloB.cs . A seconda del valore della variabile stringa "control" devo istanziare uno dei due controlli, il valore della stringa "control" viene prelevato da un file di testo...

Io non so come fare per istanziare i controlli partendo da una stringa... la stringa contiene il nome del controllo, cioè può contenere o "controlloA.cs" o "controlloB.cs", navigando ore e ore in rete ho provato di tutto... nel momento in cui purtroppo mi sono arreso :pat: sono arrivato a questo:

Codice sorgente - presumibilmente C# / VB.NET

  1. Assembly assembly = Assembly.GetExecutingAssembly();
  2. object contr = assembly.GetManifestResourceStream("myProject.controls."+control);


Ultima modifica effettuata da XineD il 25/11/2014 alle 16:45
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1127
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 17:56
Martedì, 25/11/2014
Non puoi caricare un file cs direttamente, pensaci, è un file non compilato, se l'applicazione cercasse di caricarlo sarebbe come se io cercassi di leggere un libro scritto in arabo.(Non so l'Arabo :P )

Perché non includi nel tuo programma i due controlli e poi gli istanzi con un semplice if?


La programmazione è arte... fa che i tuoi script siano degni di un museo.
PM Quote
Avatar
XineD (Normal User)
Newbie


Messaggi: 5
Iscritto: 25/11/2014

Segnala al moderatore
Postato alle 19:18
Martedì, 25/11/2014
Ciao, grazie per la risposta! :)

I due controlli sono inclusi nel programma, solo che non li posso istanziare con un if, troppo facile :D no scherzi a parte, la logica del mio programma è più complessa, questo che ho fatto è un esempio per esporre il mio problema in maniera più chiara possibile, il fatto è che se in un futuro un'altro programmatore dovrà modificare il mio programma perchè gli serve un'altro controllo, controlloC, deve sviluppare il suo controllo utente e poi soltanto aggiungerlo al mio programma senza apportare modifiche al codice...  

Ho pensato di dichiarare una variabile con il tipo contenuto in una stringa... nel senso, ho la mia stringa:

Codice sorgente - presumibilmente C# / VB.NET

  1. string tipo = "controlloA";
  2. tipo contr = new tipo();



Ovviamente così non funziona è per far capire cosa intendo, ho letto che è possibile con le reflection ma non ho trovato il modo... :(

PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1704
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 8:29
Mercoledì, 26/11/2014
Crea di plugin.

Se ti interessa e come creare dei plugin
tempo fà feci questo progetto appunto per questo.

http://www.pierotofy.it/pages/sorgenti/dettagli/19079-Blas ...

nei sorgenti è spiegato come creare un interfaccia e un plugin che vada ad interpellare determinate chiamate



PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 9:48
Mercoledì, 26/11/2014
Quello che vuoi ottenere si chiama dependency injection http://en.wikipedia.org/wiki/Dependency_injection
Non lo puoi fare al livello che indendi tu, va fatto, come ti è stato detto, usando un'interfaccia comune.
Ad ogni modo probabilmente ci sono delle falle nell'architettura dell'applicazione e stai semplicemente cercando di metterci una pezza, purtroppo questo capita in applicazioni lob.


Ingegnere Informatico
https://ldlagency.it
PM Quote
Avatar
XineD (Normal User)
Newbie


Messaggi: 5
Iscritto: 25/11/2014

Segnala al moderatore
Postato alle 20:50
Mercoledì, 26/11/2014
Buonasera! Vi ringrazio tutti per le vostre risposte :) Ho risolto il problema usando Activator.CreateIstance(...), in particolare ho fatto questo, in caso servisse a qualcun'altro ;)

Codice sorgente - presumibilmente Delphi

  1. string con = "controlloA";
  2. ObjectHandle handle = Activator.CreateInstance("myProject", "myProject.controls." + con);
  3. Object obj = handle.Unwrap();            
  4. Type type = obj.GetType();
  5. Control controllo = (Control)obj;



Grazie a tutti! :)

PM Quote