Problema con un cast utilizzando la reflection

mercoledì 10 giugno 2009 - 09.51

duombo Profilo | Newbie

Ciao a tutti,

nello sviluppo di un applicazione mi sono imbattuto in un problema da cui non riesco a venire fuori
in pratica, tramite reflection creo una nuova istanza di un oggetto in questo modo

Activator.CreateInstance(miaProp.GetType());

miaProp.GetType() mi restituisce un tipo che può essere tipoA oppure tipoB

il metodo CreateInstance mi restituisce un object, e fin qui è tutto ok
il problema è questo... dato che non so se l'object che mi ritorna è tipoA oppure tipoB
devo castare l'object in modo opportuno senza scrivere esplicitiamente il cast
in pratica vorrei fare una cosa di questo tipo

obj = (qualcosa)Activator.CreateInstance(_frm_COMITATO_DETAILS_013FormTab.GetType());

dove il "qualcosa" mi deve restituire tipoA oppure tipoB per poter castare l'oggetto


spero di essere stato chiaro nella spiegazione

Grazie a tutti

freeteo Profilo | Guru

Ciao,
secondo me il modo migliore di approcciare questa tua situazione è sicuramente usare un'interfaccia oppure una classe base, per fare in modo che casti l'oggetto che ti torna l'Activator a una di quelle 2.

Quindi dire alle 2 classi che implementano entrambe quell'interfaccia o che ereditano da quella classe base, e quindi avere un codice di questo tipo:

IOggettoMio obj = (IOggettoMio)Activator.CreateIstance(...); obj.MetodoInterfaccia(...); ....

la cosa tecnicamnete è uguale anche se "IOggettoMio" è una classe base, ma il concetto è diverso, ossia nel caso dell'interfaccia tu stai definendo solo "l'esistenza di quei metodi/proprietà" che quell'oggetto ha (una "firma" diciamo) ed ecco che infatti devi implementarlo nell'oggetto stesso:
public interface IOggettoMio { void MetodoInterfaccia(...); string Proprieta { get; set; } .... }

e poi l'oggetto reale
MioOggettoReale : IOggettoMio { .... implementi scrivendo il codice dentro ai metodi/proprietà

Se eredita non devi implementare i metodi ma se vuoi puoi farne "l'override" ossia "sovrascriverli" con il codice di quella classe che eredita, altrimenti cmq viene eseguito il codice di quella base...ma cmq ogni classe poi potrebbe avere altri metodi/proprietà etc...

Cmq ti conviene dare un'occhiata a questi link, dove viene spiegato in maniera approfondita:
http://msdn.microsoft.com/it-it/library/ms173156.aspx
http://msdn.microsoft.com/it-it/library/ms173149.aspx

Altrimenti se vuoi fare un metodo "tentative-oriented" puoi cmq provare il cast su un tipo, e vedere se torna nullo allora non è di quel tipo ma dell'altro:
object obj = Activator.CreateIstance(...); TipoA tipoa = obj as TipoA; if(tipoa == null) { TipoB tipob = obj as TipoB; tipob.... }

ma è abbastanza un "spaghetti code", meglio lavorare con Interfacce o Classi base, che è "Object-Oriented"....

Ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

Jeremy Profilo | Guru

Ciao Giuseppe.
Visto che Matteo, nella seconda parte del post, ti ha dato lo stesso suggerimento che ti ho dato io qui:
http://www.dotnethell.it/forum/messages.aspx?ThreadID=30989
lo quoto in pieno(sopratutto nella prima parte).

Ciao.

freeteo Profilo | Guru

>Visto che Matteo, nella seconda parte del post, ti ha dato lo
>stesso suggerimento che ti ho dato io qui:
>http://www.dotnethell.it/forum/messages.aspx?ThreadID=30989
sorry, non avevo visto che c'era il post doppio, avevo visto solamente che era senza risposta...

>lo quoto in pieno(sopratutto nella prima parte).
eh si, è la strada più intelligente da seguire

Ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

duombo Profilo | Newbie

grazie tante... alla fine il prb l'ho risolto :)
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5