Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[VB.NET] dichiarare variabili DI TIPI stabiliti a runtime consultando TYPE e reflection

27 views
Skip to first unread message

Soviet_Mario

unread,
Jan 11, 2012, 3:37:38 PM1/11/12
to
Sto notando un trattamento che trovo molto disomogeneo nel
modo di trattare i parametri di tipo definiti con "Of" (come
nelle funzioni generiche, che mi pare una info statica di
compile time, ma forse no) e le info dinamiche di tipo
ritornate con GetType nel tipo Type (ed affini).

In particolare non riesco a dichiarare dinamicamente una
variabile il cui tipo sia letto a runtime con GetType o affini.

Si può ?

Ho provato a usare .GetValue e .SetValue (dal FieldInfo), ma
entrambi prendono l'obbrioso parametro OBJECT, il quale per
i casting automatici mi da errore, e anche CType mi da errore.

Non riesco a venirne fuori
Qualche hint ?
ciao
Soviet


Andrea Saltarello

unread,
Jan 11, 2012, 4:01:37 PM1/11/12
to
Il 11/01/2012 21:37, Soviet_Mario ha scritto:
> In particolare non riesco a dichiarare dinamicamente una variabile il
> cui tipo sia letto a runtime con GetType o affini.
>
> Si puᅵ ?
>
ammesso che io abbia compreso la tua domanda... Hai provato con il
metodo statico CreateInstance della classe Activator?

--
.A
GUISA - http://www.guisa.org
UGIdotNET - http://www.ugidotnet.org
Read my blog at: http://blogs.ugidotnet.org/pape

Soviet_Mario

unread,
Jan 12, 2012, 4:51:12 AM1/12/12
to
Il 11/01/2012 22:01, Andrea Saltarello ha scritto:
> Il 11/01/2012 21:37, Soviet_Mario ha scritto:
>> In particolare non riesco a dichiarare dinamicamente una variabile il
>> cui tipo sia letto a runtime con GetType o affini.
>>
>> Si può ?
>>
> ammesso che io abbia compreso la tua domanda... Hai provato con il
> metodo statico CreateInstance della classe Activator?

no, non la conoscevo nemmeno : ma vado subito a vedere se è
quel che cerco. Grazie a priori


In soldoni vorrei fare una cosa "concettualmente simile a
questa" :

dim Tipo as Type = MemberInfo.FieldType()

Dim VariabDynType as TypeOf Type

L'ultima non compila, ma il mio punto è che mi servirebbe
applicare il tipo Type non come istanza, ma come tipo allo
stesso modo in cui ho

Function Dichiara(Of Tipo)()
Dim VariabStaticType as Tipo
End Function

non so se mi sono capito ... ho tralasciato :-))
ciao




>


Soviet_Mario

unread,
Jan 12, 2012, 5:00:28 AM1/12/12
to
Il 11/01/2012 22:01, Andrea Saltarello ha scritto:
> Il 11/01/2012 21:37, Soviet_Mario ha scritto:
>> In particolare non riesco a dichiarare dinamicamente una variabile il
>> cui tipo sia letto a runtime con GetType o affini.
>>
>> Si può ?
>>
> ammesso che io abbia compreso la tua domanda... Hai provato con il
> metodo statico CreateInstance della classe Activator?
>


Dunque ... il problema si ripresenta uguale in realtà.
Tutte le versioni dinamiche, senza (Of Tipo) nella firma,
che è una info statica di cui non dispongo, se no
dichiarerei direttamenta la variabile come As Tipo,
ritornano Object. NEssuna desume alcunché dal parametro Type
passato con le Info di Tipo. Al meglio mi fa un Late
Binding, che però poi coi cast non mi da nessuna garanzia, e
non riesco manco a collegarlo in modo noto ai delegati che
fanno le conversioni.
A me servirebbe poter estrarre le info (dinamiche) da un
oggetto Type, per dichiarare una variabile con Early
Binding, ma effettivamente non credo più sia possibile.
In effetti forse è cosa da linguaggio dinamico puro (tipo
python, che non conosco però).

Forse usando l'ereditarietà si potrebbe emulare tramite il
virtual, ma ormai ho una struttura che sostanzialmente non
la usa, e non posso ridisegnarla più :(

ciao ... se mi sbaglio, dimmelo eh
Soviet



LudovicoVan

unread,
Jan 18, 2012, 1:20:09 PM1/18/12
to
"Soviet_Mario" wrote in message
news:4f0eaf3c$0$1384$4faf...@reader1.news.tin.it...

> Tutte le versioni dinamiche, senza (Of Tipo) nella firma, che è una info
> statica di cui non dispongo

Che e' il motivo per cui di solito si passa una classe base o, spesso ancora
meglio, una interfaccia...

-LV

Soviet_Mario

unread,
Jan 18, 2012, 4:55:15 PM1/18/12
to
uhm ... non ho capito la risposta (la prima parte, l'esempio
delle interfacce si : dovrei mettere delle restrizioni nel
Of Tipo As Interfaccia, giusto ?)
Su quest'ultimo aspetto ora riesamino la situazione.
MA il discorso della classe base non ho capito che c'entri
(inoltre forse non mi azzecca, perché dal momento che non
posso usare l'ereditarietà multipla, proprio non riesco a
farne niente dell'ereditarietà tout court, e mi limito a
usare il pattern "HAS A" e mai "IS A", cioè piazzo un
oggetto interno, con nome, dentro la classe che ne usa
alcune sottostanti).

ciao
Soviet



>
> -LV
>


LudovicoVan

unread,
Jan 19, 2012, 6:40:51 AM1/19/12
to
"Soviet_Mario" wrote in message
news:4f173fbf$0$1381$4faf...@reader2.news.tin.it...

> uhm ... non ho capito la risposta (la prima parte, l'esempio delle
> interfacce si : dovrei mettere delle restrizioni nel Of Tipo As
> Interfaccia, giusto ?)
> Su quest'ultimo aspetto ora riesamino la situazione.

Non ho molto tempo adesso per cui ti faccio una rapida panoramica, poi mi
dirai tu se serve approfondire:

Quel tipo di problematica di solito si presenta quando uno vuole caricare
dll dinamicamente. Quello che si fa di base e' avere 3 progetti: 1)
l'applicazione; 2) la/le librerie da caricare dinamicamente; 3) una class
library che entrambi i progetti 1 e 2 referenziano, che contiene
un'interfaccia per il prog. 1 in modo da invocare uno dei CreateInstance a
fare il cast appunto ad un cosiddetto contratto noto, dall'altra parte per
il prog. 2 per avere un'interfaccia da implementare nelle proprie classi
concrete. Ulteriormente, poiche' di solito c'e' della logica comune a tutte
le eventuali librerie dinamiche, quella si implementa sempre nel prog. 3 con
una classe base che, come minimo, implementa l'interfaccia in questione e,
anche se non implementa concretamente nessuno dei suoi metodi, per lo meno
si limita a dichiararli abstract in modo da imporre alle classi derivate di
fornire una implementazione. E ovviamente questo e' solo la base di
partenza...

> MA il discorso della classe base non ho capito che c'entri (inoltre forse
> non mi azzecca, perché dal momento che non posso usare l'ereditarietà
> multipla, proprio non riesco a farne niente dell'ereditarietà tout court,
> e mi limito a usare il pattern "HAS A" e mai "IS A", cioè piazzo un
> oggetto interno, con nome, dentro la classe che ne usa alcune
> sottostanti).

IS-A e HAS-A, servono entrambi...

-LV

0 new messages