Convertire un Object nel suo tipo specifico

di il
10 risposte

Convertire un Object nel suo tipo specifico

Scusate ma mi sto perdendo tra GetType, TypeName, CType eccetera

da una cella di una DataTable mi leggo il valore contenuto in questa cella

' dt è la mia DataTable
Dim cella = dt.Rows(1).Item(0)

la variabile “cella” sarà quindi di tipo Object poichè ancora non so cosa c'è dentro.
Mi devo ricavare il tipo di dato di “cella” (String, Integer, Date, eccetera) e quindi convertire “cella” in quel tipo di dato per poterlo passare ad una funzione che deve sapere che tipo di dato gli stò passando.

Cioè, dovrei fare una cosa del genere (che ovviamente non funziona):

' dt è la mia DataTable
Dim cella = dt.Rows(1).Item(0)
Dim TipoDato = cella.GetType()
FunzioneCheMiServe(CType(cella, TipoDato))

Grazie mille
Sergio

10 Risposte

  • Re: Convertire un Object nel suo tipo specifico

    Se non ho capito male ti serve

    Dim dt As TypeCode = Type.GetTypeCode(obj.GetType())

    e in dt avrai il codice del tipo di dato dell'object (vedi enum TypeCode)

    Passerai l'object così argomento e all'interno della funzione opererai di conseguenza dopo aver determinato dt

  • Re: Convertire un Object nel suo tipo specifico

    Grazie mille Oregon, ho comunque fatto un passo avanti !!
    Con il seguente codice:

    ' dt è la mia DataTable
    Dim cella = dt.Rows(1).Item(2) ' leggo una cella dal datatable (in questo caso è un integer)
    Dim tipoDato As TypeCode = Type.GetTypeCode(cella.GetType()) ' qui mi ricavo il tipo, ed effettivamente mi dice Int32
    
    ' chiamo la funzione
    FunzioneCheMiServe(CType(cella, tipoDato))

    nell'ultima riga mi dice “il tipo ‘tipoDato’ non è definito”

    la funzione FunzioneCheMiServe non è roba mia, fa parte di una libreria che devo usare, dove la funzione fa cose diverse a seconda del tipo di dato che riceve in ingresso.
    Pensavo a questo punto di fare un “Select Case tipoDato”, e una serie di “Case” per chiamare la funzione con CType diversi, ma se potessi fare una sola chiamata mi piacerebbe di più

  • Re: Convertire un Object nel suo tipo specifico

    15/11/2023 - SirJo ha scritto:


    la funzione FunzioneCheMiServe non è roba mia, fa parte di una libreria che devo usare, dove la funzione fa cose diverse a seconda del tipo di dato che riceve in ingresso.
    Pensavo a questo punto di fare un “Select Case tipoDato”, e una serie di “Case” per chiamare la funzione con CType diversi, ma se potessi fare una sola chiamata mi piacerebbe di più

    Scusa, ma perché non posti qui la firma del metodo che devi invocare, così possiamo valutare non ragionando sull'astratto ma in modo tangibile, riferendoci direttamente alla funzione reale?

    Io non ho ben capito come è fatta la funzione da invocare, ma mi pare strano tutta questa fatica da fare per convertire diverse tipologie di dato passandole poi a una funzione che accetta tutto, o ha overload per accettare tutto.

  • Re: Convertire un Object nel suo tipo specifico

    Ciao, 
    scusate se non sono stato troppo chiaro ma non volevo essere troppo prolisso.

    Sì, stiamo parlando di overloading.
    Sto facendo una classe per convertire una generica DataTable in un foglio Excel senza dover avere installato il pacchetto Office/Excel e utilizzo una libreria gratuita di terze parti.

    La funzione che mi permette di scrivere dentro ad una cella si chiama SetCellValue ed ha questi overload:

    SetCellValue(value As Boolean)
    SetCellValue(value As Date)
    SetCellValue(value As Double)
    SetCellValue(value As IRichTextString)
    SetCellValue(value As String)

    Nel momento in cui ricevo in ingresso la DataTable devo capire ogni colonna di che tipo di dato si tratta e chiamare SetCellValue con il tipo di dato corretto.

    Per ora ho risolto facendo un Select Case trattando i tipi di dati più comuni (Integer, String, Date, Double, Single) ma mi piacerebbe capire se c'è un sistema per farlo in poche righe

    Grazie per il vostro tempo che mi dedicate
    Sergio

  • Re: Convertire un Object nel suo tipo specifico

    Non potrai certo prevedere tutti i tipi di dati possibili.

    Se passi l'Object ad una sola funzione, in quella usi GetTypeCode e ti regoli su quello che devi fare o sui tipi di dati non previsti.

  • Re: Convertire un Object nel suo tipo specifico

    16/11/2023 - SirJo ha scritto:


    Nel momento in cui ricevo in ingresso la DataTable devo capire ogni colonna di che tipo di dato si tratta e chiamare SetCellValue con il tipo di dato corretto.

    Sei sicuro che non esista un overload che accetta come parametro anche un valore di tipo Object, o simile?

    Di che libreria si tratta?

  • Re: Convertire un Object nel suo tipo specifico

    16/11/2023 - Alka ha scritto:


    Sei sicuro che non esista un overload che accetta come parametro anche un valore di tipo Object, o simile?

    Di che libreria si tratta?

    Si, sicuro, in allegato vedi immagine

    Si tratta della libreria NPOI: https://github.com/tonyqus/NPOI

    Comunque per ora ho risolto così:

            For Each riga As DataRow In dt.Rows
                row = sheet.CreateRow(rowIdx)
                colIdx = 0
                For Each cella In riga.ItemArray
                    Dim tipo = cella.GetType.Name
                    Select Case tipo
                        Case "String"
                            row.CreateCell(colIdx).SetCellValue(cella.ToString)
                        Case "Int32", "Integer"
                            row.CreateCell(colIdx).SetCellValue(CType(cella, Integer))
                        Case Else
                            ' TO DO: gestire "Date", "Boolean" e altri tipi di dati
                            Stop
                    End Select
                    colIdx += 1
                Next
                rowIdx += 1
            Next

    Lo strano è che facendo un CType verso un Integer non dia errore visto che la firma della funzione vuole un Double

  • Re: Convertire un Object nel suo tipo specifico

    16/11/2023 - oregon ha scritto:


    Non potrai certo prevedere tutti i tipi di dati possibili.

    Se passi l'Object ad una sola funzione, in quella usi GetTypeCode e ti regoli su quello che devi fare o sui tipi di dati non previsti.

    Purtroppo non posso metterci mano alla funzione, è una libreria di terze parti

  • Re: Convertire un Object nel suo tipo specifico

    16/11/2023 - SirJo ha scritto:


    Per ora ho risolto facendo un Select Case trattando i tipi di dati più comuni (Integer, String, Date, Double, Single)

    Essendo il numero di overload abbastanza limitato, il Select Case può fare al caso tuo perché non sono molte le casistiche da gestire.

    16/11/2023 - SirJo ha scritto:


    Lo strano è che facendo un CType verso un Integer non dia errore visto che la firma della funzione vuole un Double

    Un valore Integer è totalmente compatibile con Double in quanto il primo è un sottoinsieme del secondo e la conversione non presuppone la perdita di dati. E' del tutto normale. Il contrario ovviamente richiede una conversione esplicita, per ovvi motivi legati a questo aspetto.

    16/11/2023 - SirJo ha scritto:


    ma mi piacerebbe capire se c'è un sistema per farlo in poche righe

    Se fosse C#, si potrebbe memorizzare il valore proveniente dalla cella in una variabile di tipo dynamic: questo abilita un “late binding” e una risoluzione dell'overload corretto in base al tipo del valore determinato a runtime (dal runtime). :)

    Con Visual Basic la questione è più complicata: puoi approfondire in questa pagina.

  • Re: Convertire un Object nel suo tipo specifico

    Si, effettivamente con il select case non ho fatto tante righe di programma

    grazie per tutte le spiegazioni

Devi accedere o registrarti per scrivere nel forum
10 risposte