Lavorare con oggetti creati con Activator.CreateInstance

Considera il codice qui sotto:

void fun1(string typeName) { object adap = Activator.CreateInstance(typeName); adap.dowork(); //won't compile because of strongly typed. } 

Usando Activator.CreateInstance() possiamo facilmente creare istanze di qualsiasi tipo, ma se non conosciamo il nome tipografico in fase di progettazione, non è ansible ridurlo al suo tipo attuale.

La mia domanda è, come possiamo chiamare una funzione di istanza creata da Activator.CreateInstance se non possiamo abbassarla al suo tipo appropriato in quanto non conosciamo il nome del tipo in fase di progettazione, ma sappiamo che la funzione esiste.

Spero di essere stato chiaro.

Una cosa che puoi fare è assegnarla a un tipo dynamic .

 dynamic adap = Activator.CreateInstance(typeName); adap.dowork(); //this now compiles 

È anche ansible richiamare un metodo in modo dinamico utilizzando la reflection se si conosce il nome del metodo.

L’opzione migliore è conoscere un’interfaccia comune o una class base e eseguire il cast in tale ambito. Tuttavia, se ciò non è ansible, puoi usare il tipo di anatra

 dynamic adap = ... 

E il resto del tuo codice così com’è.

Se ciò non è ansible (versione .net errata, ecc.), Allora dovrai usare la riflessione.

Se sai che typeName ha il metodo doWork , sarebbe meglio che il tuo tipo implementasse un’interfaccia come:

 interface IDoWorkSupport { void DorWork(); } 

allora puoi fare il tuo codice come:

 var adap = (IDoWorkSupport) Activator.CreateInstance(typeName); adap.DoWork(); //this now compiles 

In questo caso è una soluzione più orientata agli oggetti.