Как заполнить DataTable списком (Of T) или преобразовать List (Of T) в DataTable? - PullRequest
6 голосов
/ 27 ноября 2009

Я прочитал много сообщений на эту тему; среди них и совсем недавно .NET - преобразование общего сбора в таблицу данных . К сожалению, все безрезультатно.

У меня есть общая коллекция структур:

Private Structure MyStruct
Dim sState as String
Dim lValue as Long
Dim iLayer as Integer
End Structure

Dim LOStates As New List(Of MyStruct)

Мне нужно заполнить таблицу данных этим списком структур, но я не знаю, как это сделать. Я использую vb.net в Visual Studio 2008.

Любые идеи будут высоко оценены

Ответы [ 2 ]

16 голосов
/ 27 ноября 2009

Код, который вы связали, предполагает, что члены объявлены как свойства. Вы не объявили свойства. Вы можете заставить его работать с Reflection:

Imports System.Reflection
...

      Public Shared Function ConvertToDataTable(Of T)(ByVal list As IList(Of T)) As DataTable
        Dim table As New DataTable()
        Dim fields() As FieldInfo = GetType(T).GetFields()
        For Each field As FieldInfo In fields
          table.Columns.Add(field.Name, field.FieldType)
        Next
        For Each item As T In list
          Dim row As DataRow = table.NewRow()
          For Each field As FieldInfo In fields
            row(field.Name) = field.GetValue(item)
          Next
          table.Rows.Add(row)
        Next
        Return table
      End Function
2 голосов
/ 14 июля 2014

У меня та же проблема, что и у @SamSelikoff, перенесено в GetProperties:

Public Shared Function ConvertToDataTable(Of t)(
                                                  ByVal list As IList(Of t)
                                               ) As DataTable
    Dim table As New DataTable()
    If Not list.Any Then
        'don't know schema ....
        Return table
    End If
    Dim fields() = list.First.GetType.GetProperties
    For Each field In fields
        table.Columns.Add(field.Name, field.PropertyType)
    Next
    For Each item In list
        Dim row As DataRow = table.NewRow()
        For Each field In fields
            dim p = item.GetType.GetProperty(field.Name)
            row(field.Name) = p.GetValue(item, Nothing)
        Next
        table.Rows.Add(row)
    Next
    Return table
End Function
...