Problema con un cast utilizzando la reflection

mercoledì 10 giugno 2009 - 09.53

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

phai Profilo | Newbie

Ciao,

nell'attesa di pareri più autorevoli provo a darti una possibile soluzione... spero possa andare bene... magari la provi per ingannare il tempo!!! :)

obj = (oggdacreare.GetType())Activator.CreateInstance(oggdacreare.GetType());

Comunque mi pare di capire che poi su obj tu possa invocare dei metodi che, quindi, avrebbero la stessa signature sia per tipoA che per tipoB. A mio parere, quindi, avrebbe molto più senso fare che i due tipi implementino una stessa interfaccia... che è la soluzione più elegante.
Mi spiego grossolanamente: definisci un'interfaccia InterfacciaAB e definisci i metodi comuni. Dici che tipoA e tipoB la implementano.

Il tuo codice diventa:
InterfacciaAB obj = (InterfacciaAB)Activator.CreateInstance(oggdacreare.GetType());

Spero ti sia utile... ciao ;)

duombo Profilo | Newbie

Ciao e grazie per la risposta,

nell'effettuare questa operazione obj = (oggdacreare.GetType())Activator.CreateInstance(oggdacreare.GetType());
questa porzione di codice (oggdacreare.GetType()) da un errore di compilazione "type or namespace oggdacreare could not be found"

e utilizzando invece l'interfaccia poi l'oggetto ottenuto lo devo cmq castare al tipo che mi serve ovvero

interfacciaAB xx = (interfacciaAB)Activator.CreateInstance(oggdacreare.GetType()); proprietà = xx; //ma questo non va xchè devo esplicitare il cast, cosa che non voglio fare

phai Profilo | Newbie

>e utilizzando invece l'interfaccia poi l'oggetto ottenuto lo
>devo cmq castare al tipo che mi serve ovvero
>
>interfacciaAB xx = (interfacciaAB)Activator.CreateInstance(oggdacreare.GetType());
>
>proprietà = xx; //ma questo non va xchè devo esplicitare il cast,
>cosa che non voglio fare

Scusami, ma "proprietà" di che tipo di dato è?
Perché, comunque, in fase di compilazione non lo puoi sapere... pertanto se fosse di tipo InerfacciaAB potresti assegnarli il tipo.

Poi forse non è proprio quello che vuoi... magari se mi dici un pochino cosa deve fare il tuo codice possiamo vedere di trovare una soluzione...

Jeremy Profilo | Guru

Ciao Giuseppe.
Se sei già a conoscenza dei due possibili tipi, puoi eseguire l'equivalente del TryCast di Vb.net, in questo modo:

[code]Obj= Activator.CreateInstance(_frm_COMITATO_DETAILS_013FormTab.GetType()) as Qualcosa;
if (Obj == null)
// cast fallito
else
// cast eseguito
end if
[code]
Facci sapere...
Ciao

duombo Profilo | Newbie

grazie anche a te :) il prb è risolto ora... quando ho aperto il 3d non mi sono accorto di averlo duplicato :)
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