Traspasar las propiedades de una clase a un DataTable
Abril 20, 2008
¿Quien no ha tenido en algun momento que, en su cotidiano quehacer, traspasar los datos de objetos de cierta clase (encapulados en propiedades) a un Datatable? Es algo que siempre hacemos (o haciamos algunos), y sorteamos del siguiente modo:
- Creamos un Datatable, y añadimos tantas columnas como propiedades tenga la clase.
- Iterando objeto por objeto (si es un listado)
- Finalmente, por cada objeto, pasamos su valor a la columna correspondiente.
Bueno, si lo tienes en un Typed Dataset, no habria problemas (mas he oido comentarios referidos al bajo desempeño de esto; empero, en distintos escenarios, las cosas pueden cambiar), mas si creas algun DataTable para realizarlo, te quitara tiempo. Por ello ofrezco a continuacion lineas de codigo en VB .Net que hara mas sencilla esta tarea. Enjoy it!
Imports System.Data
Imports System.Reflection
Public Module UtilDatos
‘ Clona las propiedades de una entidad y las traspasa como columnas a un DataTable
‘ Tipo es el tipo (clase) al que se le clonarán las propiedades
‘ Retorna un DataTable que tiene como columnas las propiedades del tipo especificado
‘ OJO: Las propiedades indexadas no son consideradas
Public Function ClonarPropiedades(ByVal Tipo As Type) As DataTable
Dim dtbTablaClonadora As New DataTable
For Each objPropiedad As PropertyInfo In Tipo.GetProperties
If objPropiedad.GetIndexParameters.Length = 0 Then
Dim objColumna As New DataColumn
objColumna.Caption = objPropiedad.Name
objColumna.ColumnName = objPropiedad.Name
objColumna.DataType = objPropiedad.PropertyType
dtbTablaClonadora.Columns.Add(objColumna)
End If
Next
Return dtbTablaClonadora
End Function
‘ Traspasa los datos que tengan los objetos del listado a un DataTable
Public Function ClonarDatos(ByVal Objetos As IList) As DataTable
If Objetos.Count > 0 Then
Dim dtbMatrizElementos As Data.DataTable
dtbMatrizElementos = UtilDatos.ClonarPropiedades(Objetos(0).GetType)
For Each objElemento As Object In Objetos
Dim drwElemento As Data.DataRow = dtbMatrizElementos.NewRow
For Each dtcCabecera As Data.DataColumn In tbMatrizElementos.Columns
drwElemento(dtcCabecera.ColumnName) = _
objElemento.GetType.GetProperty(dtcCabecera.ColumnName) _
.GetValue(objElemento, New Object() {})
Next
dtbMatrizElementos.Rows.Add(drwElemento)
Next
Return dtbMatrizElementos
End If
Return Nothing
End Function
End Module

Mayo 7, 2008 en 8:04 am
Exelente
gracias,