mercoledì 23 maggio 2012

Convertire un array di classi in DataTable

Utilizzando la Relfection e i Generics è possibile convertire (sarebbe meglio dire trasformare) un qualsiasi array di classi in un DataTable:


Imports System.Reflection


Public Shared Function convertFromClassToDatatable(Of T)(ByVal tableName As String, ByVal dati As T(), ByVal conIntestazione As Boolean) As DataTable

    Dim dt As New DataTable
    dt.TableName = tableName

    For Each prop As PropertyInfo In GetType(T).GetProperties
        dt.Columns.Add(prop.Name)
    Next

    If conIntestazione Then
        Dim drIntestazione As DataRow = dt.NewRow
        For Each col As DataColumn In dt.Columns
            drIntestazione.Item(col.ColumnName) = col.ColumnName.ToUpper
        Next
        dt.Rows.Add(drIntestazione)
    End If

    For Each dato As T In dati
        Dim dr As DataRow = dt.NewRow

        For Each prop As PropertyInfo In GetType(T).GetProperties
            dr.Item(dt.Columns.IndexOf(prop.Name)) = prop.GetValue(dato, Nothing)
        Next

        dt.Rows.Add(dr)
    Next

    Return dt
End Function


Utilizzo:

Dim mioArray As miaClasse()

convertFromClassToDatatable("Tabella di prova"),  mioArray, False)



Note: 
Siccome vengono utilizzati i Generics, in automatico il sistema sa che classe è "dati", che viene passata alla funzione. 
La DataTable risultante avrà TableName = tableName e i vari ColumnName saranno i nomi delle proprietà della classe "miaClasse"