2012-05-31 18 views
5

Sono abbastanza sicuro che questo è stato chiesto prima, ma purtroppo l'unica cosa che ho trovato è stata this che non era la soluzione per me. Nel mio progetto attuale che faccio qualcosa di simile:Come posso trasmettere oggetti dinamicamente?

private object obj; 

private void Initialize() 
{ 
    obj.Initialize(); 
} 

private void CreateInstanceA() 
{ 
    obj = Activator.CreateInstance(typeof(MyClassA)); 
} 

private void CreateInstanceB() 
{ 
    obj = Activator.CreateInstance(typeof(MyClassB)); 
} 

Questo codice non funziona, naturalmente, perché non ho gettato obj perché il suo tipo cambia in modo dinamico.

Come posso eseguire il cast in modo dinamico?

+4

Sembra che questo non sarebbe il modo migliore per fare le cose. Una specie di codice mi fa l'odore. Qual è il contesto più ampio di ciò che stai cercando di realizzare? – FishBasketGordo

+0

Oltre a inizializzarlo, cos'altro hai intenzione di fare con 'obj'? –

+0

@RaymondChen Ho appena realizzato un semplice progetto WinForm per testare le mie librerie di classi. – Leri

risposta

9

tre opzioni:

  • Se controlli entrambe le classi, e si può fare a implementare un'interfaccia comune che include tutto il necessario, poi farlo - ed espressi all'interfaccia
  • Se sei utilizzando C# 4 e .NET 4, è possibile utilizzare la digitazione dinamica, dichiarare la variabile come private dynamic obj; e compila e trova il metodo corretto al momento dell'esecuzione
  • In caso contrario, utilizzare la riflessione per trovare e chiamare il metodo.

Fondamentalmente fusione basato su un tipo di tempo di esecuzione non ha senso, come parte del punto di fusione è quello di dare al compilatore ulteriori informazioni ... e semplicemente non hanno che nel questo caso.

La prima opzione è di gran lunga la più bella se è possibile ottenerla.

+1

e circa Dipendenza iniezione –

+1

Iniezione di dipendenza senza interfacce/classe base astratta? Come? Se le interfacce possono essere definite, lo scenario prima è sufficiente – Tilak

+0

Non sarebbe una classe base migliore, al contrario di un'interfaccia? Questo è un * is-a * (classe astratta), al contrario di una * can-do * (interfaccia). Supponendo che i tipi siano simili in natura ovviamente – mattytommo

0

Suppongo che CreatInstanceB() debba effettivamente utilizzare MyClassB, corretto?

In questo caso è possibile utilizzare:

((MyClassA)obj).Initialize(); 

...

((MyClassB)obj).Initialize(); 

Oppure si potrebbe fare un'interfaccia che ha un metodo di inizializzazione e definire obj come tale interfaccia.

+0

Penso che, nel metodo di inizializzazione, MyClassA o MyClassB non siano noti, che è il punto della domanda – Tilak

+0

Sì, hai ragione. Ho modificato la domanda. Farò meglio ad usare la parola chiave 'dynamic' come suggerito da @JonSkeet. – Leri

+0

Vero, lo mancava. Possiamo sempre contare su Mr Skeet. – Slugart

Problemi correlati