如何使用List(Of t)填充DataTable或将List(Of t)转换为DataTable?

8

我已经阅读了许多关于这个主题的帖子,其中最近的一篇是.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。

非常感谢任何帮助和见解。

3个回答

20
你提供的代码假设成员被声明为属性,可是你并没有声明属性。你可以使用反射来让它工作:
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

正是在调试模式下,我才能确定表格计数为0。for each循环确实循环了。在执行返回表格语句之前,有3列但没有行。 - 8thWonder
非常抱歉给你带来了麻烦!我真的很感激你的帮助和耐心 :) - 8thWonder
@HansPassant GetType(T).GetFields() 对我来说返回一个空集合,我不得不使用 GetProperties,但这不会返回可转换为 FieldInfo 的类型。我正在使用 ADO 实体模型。 - Sam Selikoff
如何在 VB.NET 中将列表传递给此函数 - Amarnath Balasubramanian
@SamSelikoff,代码片段已经翻译为GetProperties,请参考https://dev59.com/sUrSa4cB1Zd3GeqPXIcs#24739862。 - dani herrera
显示剩余4条评论

8

我和@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

0

如果有人正在处理可空类型,可以使用@Hans Passant的以下函数:

For Each field As FieldInfo In fields
' Extra check for nullable
If field.FieldType.AssemblyQualifiedName.Contains("System.Nullable") Then
    ' Insert proper type
    If field.FieldType.AssemblyQualifiedName.Contains("System.DateTime") Then
       table.Columns.Add(field.Name, Type.GetType("System.DateTime"))
    End If
Else
    table.Columns.Add(field.Name, field.FieldType)
End If
Next

数值:

For Each item As T In list
Dim row As DataRow = table.NewRow()
For Each field As FieldInfo In fields
    ' Check if value is null
    If field.GetValue(item) is nothing Then
        Continue For
    End If
    row(field.Name) = field.GetValue(item)
Next
table.Rows.Add(row)
Next

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接