Как заполнить DataTable списком (Of T) или преобразовать List (Of T) в DataTable?
-
05-07-2019 - |
Вопрос
Я прочитал много сообщений на эту тему; среди них и совсем недавно .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)
Мне нужно заполнить DataTable этим списком структур, но я не знаю, как это сделать. Я использую vb.net в Visual Studio 2008.
Любые идеи будут высоко оценены
Решение
Код, который вы связали, предполагает, что члены объявлены как свойства. Вы не объявили свойства. Вы можете заставить это работать с Отражением:
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
Другие советы
У меня та же проблема, что и у @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
Не связан с StackOverflow