Recuperare il Tipo

venerdì 19 dicembre 2008 - 17.15

Teech Profilo | Expert

Ho una classe con alcune proprietà di vario tipo:
'Per semplicità uso dei campi Public Class MiaClasse Public Prop1 As String Public Prop2 As String End Class
Ho un'altra classe che accetta un oggetto MiaClasse nel costruttore per elaborarlo.
Public Class ElaboraMiaClasse Private _mc As MiaClasse Sub New(ByRef mc As MiaClasse) _mc=mc End Sub Public Sub Elabora() Dim i As Integer=100 _mc.Prop1=i <--- Problema End Sub End Class
Il problema è che vorrei effettuare un cast della variabile 'i' sul tipo della proprietà non sapendo a design time che tipo è... Vorrei fare una cosa del tipo:
_mc.Prop1=DirectCast(i, GetType(i))
Mi serve perchè non vorrei preoccuparmi nel caso in cui dovessi variare il tipo della proprietà in MiaClasse.
Ovviamente questo codice non funziona... Si può fare? Se si come?

Grazie!!!
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

rossimarko Profilo | Guru

Ciao,

il tuo caso mi sembra adatto all'utilizzo dei generics: http://msdn.microsoft.com/en-us/library/w256ka79.aspx

Però non ho ben capito la tua esigenza, perchè se per caso MiaClasse.Prop diventa string tu comunque dovrai cambiare il codice della funzione Elabora in tutti i casi perchè comunque dovrai usare una stringa invece che un int.

Se invece vuoi definire interno della classe di elaborazione il tipo della proprietà di "MiaClasse" quindi int, piuttosto che string o altro allora i generics penso che facciano al caso tuo, perchè potresti passare a MiaClasse anche il tipo della proprietà direttamente nella dichiarazione
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

Teech Profilo | Expert

Il fatto è che devo passare al costruttore di un Form (Classe che elabora) la classe MiaClasse... Manualmente, nel Load del Form associo i valori delle proprietà alle proprietà dei controlli (TextBox.Text=MiaClasse.Prop1, ecc).
All'uscita del form rigiro le proprietà dei controlli sulle proprietà della classe (MiaClasse.Prop1=TextBox.Text, ecc): in questa operazione vorrei sapere il tipo di Prop1 per effettuare il cast del dato.

Ti anticipo: non uso i DataBindings perchè mi hanno causato un sacco di problemi nella gestione dei tipi DateTime sui controlli DateTimePicker e perchè a volte un controllo ha 2 proprietà della MiaClasse associate (in un textbox sia la proprietà Tag e Text ad esempio su 2 diverse proprietà di MiaClasse) e questo crea grossi problemi.
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

rossimarko Profilo | Guru

Tu vorresti che nal caso in cui Prop1 sia Integer venga fatto
MiaClasse.Prop1=Convert.toInt32(TextBox.Text)

e nel caso in cui un domani diventasse DateTime:
MiaClasse.Prop1=Convert.ToDateTime(TextBox.Text)
senza dover modificare il codice di conversione?

Ovvero senza dover sostituire Convert.ToInt32 con Convert.ToDateTime ?
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

Teech Profilo | Expert

Esattamente!!! Però non so nemmeno se è possibile... Era un'idea
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

yagamiraito Profilo | Newbie

Probabilmente non c'entrerà nulla, ma prova a vedere se è di questo che hai bisogno
http://www.dotnethell.it/forum/messages.aspx?ThreadID=26486

Teech Profilo | Expert

Purtroppo ho sempre il problema di dover passare il tipo T corretto al metodo
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

rossimarko Profilo | Guru

>Purtroppo ho sempre il problema di dover passare il tipo T corretto
>al metodo

Purtroppo non vedo molte alternative.. Sicuramente quella dei generics è quella che preferisco, perchè è sempre bene sapere a priori il tipo dell'oggeto, così da poter avere delle segnalazioni anche in fase di compilazione.

Un alternativa che fornisce vb è quella di togliere l'option strict e usare una funzione come Convert.ChangeType http://msdn.microsoft.com/en-us/library/dtb69x08.aspx:

dim i as Date dim strOggetto as String = "1/1/2008" i = Convert.ChangeType(stroggetto, i.GetType())

Però consiglio di lasciare sempre abilitato l'option strict (anzi, spesso va abilitato manualmente nelle proprietà di progetto)
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

aiedail92 Profilo | Expert

Ciao

In alternativa, dato che i dati più comuni (Integer, Double, DateTime ecc) espongono una funzione Parse, e con Visual Basic puoi accedere alle funzioni statiche attraverso un'istanza, puoi utilizzare il metodo Parse:

_mc.Prop1 = _mc.Prop1.Parse(TextBox1.Text)

Luca
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5