Creazione di un oggetto senza conoscere il nome della classe in fase di progettazione
-
09-06-2019 - |
Domanda
Usando la riflessione, devo indagare su una DLL utente e creare un oggetto di una classe al suo interno.
Qual è il modo più semplice per farlo?
Soluzione
Tentativo Attivatore.CreateInstance.
Altri suggerimenti
System.Reflection.Assembly
è la classe che vorrai utilizzare.Contiene molti metodi per eseguire l'iterazione sui tipi contenuti in una DLL utente.Puoi scorrere ciascuna classe, magari vedere se eredita da una particolare interfaccia, ecc.
http://msdn.microsoft.com/en-us/library/system.reflection.assembly_members.aspx
Investigare Assembly.GetTypes()
metodo per ottenere l'elenco dei tipi, o Assembly.GetExportedTypes()
solo per quelli pubblici.
Puoi creare un'istanza di una classe da un oggetto Type utilizzando Activator.CreateInstance, per ottenere tutti i tipi in una DLL puoi utilizzare Assembly.GetTypes
Dai un'occhiata a questi link:
http://www.java2s.com/Code/CSharp/Development-Class/Createanobjectusingreflection.htm
http://msdn.microsoft.com/en-us/library/k3a58006.aspx
Fondamentalmente usi la riflessione per caricare un assembly, quindi trovi un tipo che ti interessa.Una volta ottenuto il tipo, puoi chiedere di trovare i suoi costruttori o altri metodi/proprietà.Una volta ottenuto il costruttore, puoi invocarlo.Facile!
Come già detto, è necessario inserire il namespace System.Reflection.
Se conosci in anticipo la posizione/nome della DLL che desideri caricare, devi scorrere Assembly.GetTypes().
In Pseudocodice sarebbe simile a questo:
Creare e assemblare un oggetto.
Scorrere tutti i tipi contenuti nell'assembly.
Una volta trovato quello che stai cercando, invocalo (CreateInstance)…
Usalo saggiamente.
;)
Ho un sacco di codice Reflection se vuoi dare un'occhiata in giro, ma il compito è davvero semplice e ci sono almeno una dozzina di articoli con esempi in giro.(Alias Google).Nonostante ciò, MSDN è tuo amico per Reflection Reference.