Conforme já expliquei sou novo nas Lib ACBr mas estou gostando muito, portanto gostaria de postar aqui a forma que fiz para N Titulos usando as Classes.
O codigo abaixo se alguém achar bom, por favor pode otimizar.
Parabéns a equipe ACBr.
Dim Boleto As New ACBrLib.Boleto.ACBrBoleto
Dim Titulo As New ACBrLib.Boleto.Titulo
Dim Titulos As New List(Of ACBrLib.Boleto.Titulo)
Dim N As Int32 = 1
Boleto.LimparLista()
Call DataRowObject(drConta, Boleto.Config.Banco, "Banco.") 'DataColumn.name=Prefixo+Property.Name, caso seja necessário
Call DataRowObject(drConta, Boleto.Config.Cedente, "Conta.")
Call DataRowObject(drConta, Boleto.Config.Cedente, "Cedente.")
For Each dr As DataRow In tbCompromisso.Rows
Titulo = New ACBrLib.Boleto.Titulo
Titulo.NossoNumero = N.ToString("0000000000")
Call DataRowObject(dr, Titulo, "Titulo.")
Call DataRowObject(dr, Titulo.Sacado, "Sacado.")
Call DataRowObject(dr, Titulo.Sacado.Avalista, "Sacado.Avalista.")
Titulos.Add(Titulo)
Next
Boleto.IncluirTitulos(Titulos.ToArray())
Boleto.Imprimir()
'Função para popular os Types
Private Shared Sub DataRowObject(dr As DataRow, sender As Object, Optional ByVal Prefixo As String = "")
'ler propriedades - obter valor em datarow.column - atribuir valor a propriedade
Dim T As Type = sender.GetType()
Dim value As Object, Col As String, obj As Object
For Each P In T.GetProperties(BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.NonPublic)
Select Case True
Case dr.Table.Columns(Prefixo & P.Name) IsNot Nothing
Col = Prefixo & P.Name
Case dr.Table.Columns(P.Name) IsNot Nothing
Col = P.Name
Case Else : Continue For
End Select
If String.IsNullOrEmpty(dr(Col).ToString) Then Continue For
value = P.GetValue(sender)
Select Case P.PropertyType()
Case GetType(Integer)
Integer.TryParse(dr(Col), value)
Case GetType(Boolean)
value = CBool(Integer.TryParse(dr(Col), value))
Case GetType(String)
value = dr(Col).ToString
Case GetType(System.Decimal), GetType(System.Double)
Decimal.TryParse(dr(Col), NumberStyles.Number, NumberFormatInfo, value)
Case GetType(System.DateTime)
DateTime.TryParseExact(dr(Col), {"dd/MM/yyyy"}, Nothing, DateTimeStyles.AssumeLocal, value)
Case Else
Select Case True
Case P.PropertyType.BaseType Is (GetType(System.Enum))
Integer.TryParse(dr(Col), value)
Case P.PropertyType.FullName.Contains("System.DateTime") 'este case é devido não saber ainda como pegar classe Nullable-datetime
DateTime.TryParseExact(dr(Col), {"dd/MM/yyyy"}, Nothing, DateTimeStyles.AssumeLocal, value)
Case P.PropertyType.FullName.Contains("System.Decimal") 'este case é devido não saber ainda como pegar classe Nullable-datetime
Decimal.TryParse(dr(Col), NumberStyles.Number, NumberFormatInfo, value)
Case Else
value = New Generic.List(Of String) From {dr(Col).ToString}
Continue For
End Select
End Select
P.SetValue(sender, value)
Next
End Sub
A liguagem utilizada VB.NET VS 2019