TUtils

Imports System.Reflection

Public Class TUtils(Of T As New)
''' <summary>
''' TClassの各Propertyにセットされた属性情報から、ファイル出力に関するパラメータを取得し
''' パラメータ値に応じて出力対象項目のフィルタリング、ヘッダ名の取得、出力項目の順序も制御する
''' </summary>
''' <returns></returns>
Public Function GetBindingProperty(ByVal dataList As TData(Of T)) As List(Of BindingProperty)
'TClassのProprty全てについて、そのProperty情報(:=tProperty)、そのProperty属性(:=CSVColumn)を取得
Dim target = dataList.GetType().GetGenericArguments(0).GetProperties().Select(Function(x) New BindingProperty() With {
.tProperty = x,
.CSVColumn = TryCast(x.GetCustomAttributes(GetType(DisplayInfomationAttribute), False).FirstOrDefault, DisplayInfomationAttribute)
}) _
.Where(Function(x) Not x.CSVColumn Is Nothing And x.CSVColumn.IsExport = True) _
.OrderBy(Function(x) x.CSVColumn.ExportOrder) _
.ToList()
Return target
End Function
''' <summary>
''' TDataのListを、Excelに一括出力する為の添え字1から始まる2次元配列に変換する
''' </summary>
''' <param name="dataList"></param>
''' <param name="IsSetHeader"></param>
''' <returns></returns>
Public Function ConvertTDataToArrayForExcel(ByVal dataList As TData(Of T), ByVal Optional IsSetHeader As Boolean = False) As String(,)
Dim list As New List(Of Object)
Dim bindingProperties As List(Of BindingProperty) = Me.GetBindingProperty(dataList)
'---ヘッダが出力対象の場合取得
If IsSetHeader Then list.Add(bindingProperties.Select(Function(x) x.CSVColumn.FileHeaderText).ToArray)
'---データ部を取得
If Not dataList Is Nothing Then
For Each record In dataList.DList
list.Add(bindingProperties.Select(Function(x) x.tProperty.GetValue(record)))
Next
End If
If list.Count = NO_VALUE Then Return Nothing
'---ExcelのRangeに直接配列をセットし出力する場合、配列の添え時を1から始めなければならない
'---その為、1から始まる配列を生成する
Dim lower() As Integer = {1, 1}
Dim length() As Integer = {list.Count, list(0).length}
Dim eportArray(,) As String
eportArray = CType(Array.CreateInstance(Type.GetType("System.String"), length, lower), String(,))
'---生成した配列に出力対象のTListの内容を展開
Dim colNo, rowNo As Integer
For Each wrkRow In list
colNo = 0
rowNo += 1
For Each wrkCol In wrkRow
colNo += 1
eportArray(rowNo, colNo) = wrkCol?.ToString
Next
Next
Return eportArray
End Function
End Class