DataTableにList(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にこの構造のリストを入力する必要がありますが、これを実行する方法がわかりません。 Visual Studio 2008でvb.netを使用しています。
どんな洞察も大歓迎です
解決
リンクしたコードは、メンバーがプロパティとして宣言されていることを前提としています。プロパティを宣言しませんでした。 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
他のヒント
@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