CopyToEntityList

    <Extension()> _
    Public Function CopyToEntityList(Of T As New)(ByVal dt As DataTable) As IEnumerable(Of T)
        Dim myPpts = New T().GetType().GetProperties()
        Dim colList = From col In dt.Columns.Cast(Of DataColumn)() _
              Select col.ColumnName, col.DataType
        Dim pptList = (From ppt In myPpts _
                       Where colList.Select(Function(p) p.ColumnName).Contains(ppt.Name) _
                       And colList.Select(Function(p) p.DataType).Contains( _
                                        If(Nullable.GetUnderlyingType(ppt.PropertyType) Is Nothing, _
                                           ppt.PropertyType, Nullable.GetUnderlyingType(ppt.PropertyType))) _
                       Select ppt)

        Dim NewList As New List(Of T)
        For Each drSourceItem As DataRow In dt.Rows
            Dim NewT As New T()
            For Each entityItem As PropertyInfo In pptList
                entityItem.SetValue(NewT, If(IsDBNull(drSourceItem(entityItem.Name)), Nothing, drSourceItem(entityItem.Name)), Nothing)
            Next
            NewList.Add(NewT)
        Next

        Return NewList
    End Function
Example:
    Sub Main()
        Dim dt As New DataTable
        dt.Columns.AddRange(New DataColumn() {New DataColumn("ColName", GetType(System.String)), _
                                              New DataColumn("ColDataType", GetType(System.String)), _
                                              New DataColumn("ColType", GetType(System.String)), _
                                              New DataColumn("IntCol", GetType(System.Int32)), _
                                              New DataColumn("DateCol", GetType(System.DateTime)) _
                                              })
        dt.Rows.Add("Leo", "DataType", "IntType", 50, Today)
        dt.Rows.Add("Rose", "StrDataType", "StrType", 90, Now)
        dt.Rows.Add("Alice", "StrDataType", DBNull.Value, 150, DateAdd(DateInterval.Day, 55, Today))
        dt.Rows.Add("Emy", "StrDataType", "StrType", DBNull.Value, DateAdd(DateInterval.Day, 55, Today))
        dt.Rows.Add("Amy", "StrDataType", "StrType", 150, DBNull.Value)

        Dim rtnList = dt.CopyToEntityList(Of test)()

        For Each item In rtnList
            Console.WriteLine(String.Format("ColName = {0}, ColDataType = {1}, ColType = {2}, IntCol = {3}, DateCol = {4}", _
                                            item.ColName, item.ColDataType, item.ColType, item.IntCol, item.DateCol))
        Next

        Console.ReadLine()
    End Sub

''' Test is test class, have 5 properties, 2 properties allow nullable, like below: 
        Private _ColName As String
        Private _ColDataType As String
        Private _ColType As String
        Private _IntCol As Integer?
        Private _DateCol As DateTime?

Description

Copy DataTable rows to IEnumerable(Of T)

Details

Double click on the code to select all.

 

;