Imports System.Collections.Generic
Imports System.Reflection
Imports System.Runtime.CompilerServices
Imports DataTablePrettyPrinter
Dim users = { New UserViewModel() With { .Username = "dday9" } }
Dim auditLogs = { New AuditLogViewModel() With {.User = users.First(), .Description = "Foo"}, New AuditLogViewModel() With {.Description = "Bar"} }
Dim dt = auditLogs.ToDataTable()
Console.WriteLine(dt.ToPrettyPrintedString())
Public Class UserViewModel
Public Property Username As String
Public Class AuditLogViewModel
<DataTableIgnoreAttribute> Public Property User As UserViewModel
Public ReadOnly Property Username As String
If (User Is Nothing) Then
Public Property Description As String
Public Class DataTableIgnoreAttribute
Public Property IgnoreColumn As Boolean
Module DataTableExtensionModule
Public Function ToDataTable(Of T)(items As IEnumerable(Of T)) As DataTable
Dim dataTableConverted = New DataTable(GetType(T).Name)
Dim enumerableProperties = GetType(T). _
GetProperties(BindingFlags.Public Or BindingFlags.Instance). _
Dim dataTableIgnore = prop.GetCustomAttribute(Of DataTableIgnoreAttribute)
Return dataTableIgnore Is Nothing OrElse Not dataTableIgnore.IgnoreColumn
For Each prop In enumerableProperties
dataTableConverted.Columns.Add(prop.Name, prop.PropertyType)
Dim values = New Object(enumerableProperties.Length - 1) {}
For i = 0 To enumerableProperties.Length - 1
values(i) = enumerableProperties(i).GetValue(item, Nothing)
dataTableConverted.Rows.Add(values)
Return dataTableConverted