2013-12-17 4 views
0

엄격한 옵션을 사용하여 FileHelpers를 사용하면서 발생하는 오류를 어떻게 제거 할 수 있는지 결정하는 데 몇 가지 문제가 있습니다.FileHelpers Master/Detail - Option Strict On은 후기 바인딩을 허용하지 않습니다.

<DelimitedRecord(";")> 
Public NotInheritable Class CabecDocVgr 
    Public TipoLinha As String 
    Public Doc As String 
    Public Entidade As String 
    Public DataDoc As String 
    Public RefDoc As String 
End Class 

이 하나, 자세한 사항은 :

나는이 주 (主)의 클래스 인 MasterDetailEngine

Private Function ReadCsvFile(ByVal fileName As String, ByVal tipodoc As String) As Boolean 
engine = New MasterDetailEngine(GetType(CabecDocVgr), GetType(LinhasDocVgr), CommonSelector.MasterIfContains, 
              "@") 
      _res = engine.ReadFile(strStartPath) 
Return true 
End Function 

를 호출하는 클래스 MasterDetails에게 기능을

Private _res As MasterDetails() 

초기화 :

<DelimitedRecord(";")> _ 
Public NotInheritable Class LinhasDocVgr 
    Public Tipolinha As String 
    Public Artigo As String 
    Public Armazem As String 
    Public Localizacao As String 
    Public Lote As String 
    Public Qtd As Integer 
    Public UniMedida As String 
    Public DataValidade As String 
End Class 

각 마스터/세부 정보는 헤더와 관련 행이있는 새 문서를 만드는 것입니다.

오류가 표시되는 위치를 내가 마스터 또는 세부 클래스의 멤버 호출 할 때 나는 하나의 예를 줄 수

"옵션 엄격한에 바인딩을 허용하지 : _res(numdoc).Master.refDoc를 호출 예를 들어

Private Function TransformaDocF(ByVal tipoDoc As String) As Boolean 

    For numdoc As Integer = 0 To _res.Length - 1 

     Dim documentosOrigem(0) As Object 
     Dim docOrigem As New GcpBEDocumentoCompra 
     Dim docDestino As New GcpBEDocumentoCompra 

     Dim query As String = String.Format("SELECT TOP 1 NumDoc FROM cabecdoc WHERE RefDocOrig='{0}'", 
              _res(numdoc).Master.doc) 

     Dim lista As New StdBELista() 
     lista = Motor.Consulta(query) 

     If Not lista.Vazia Then 
      If Not lista.NoInicio And Not lista.NoFim Then 
       Dim numeroDoc As Integer = CInt(lista.Valor("NumDoc")) 
       'bExecuta = True 
      End If 
     End If 

     docOrigem = Motor.Comercial.Compras.Edita("000", "VGR", "2013", _res(numdoc).Master.doc) 
     documentosOrigem(0) = docOrigem 

     docDestino.TipoEntidade = "F" 
     docDestino.Serie = "2013" 
     docDestino.Entidade = docOrigem.Entidade.TrimStart(CChar("0")) 
     'DocDestino.DataDoc = "01-01-2013" 
     docDestino.Tipodoc = "VFA" 
     docDestino.RefDocOrig = _res(numdoc).Master.refDoc 

     Try 
      If docOrigem.Linhas.NumItens > 0 Then 
       For numlinha As Integer = 0 To _res(numdoc).Details.Length - 1 
        If docOrigem.Linhas(numlinha + 1).Artigo = _res(numdoc).Details(numlinha).Artigo Then 
         docOrigem.Linhas(numlinha + 1).Quantidade = docOrigem.Linhas(numlinha + 1).QuantSatisfeita + 
                    _res(numdoc).Details(numlinha).Qtd 
        End If 
       Next 
      End If 
      Motor.Comercial.Vendas.TransformaDocumentoEX2(documentosOrigem, CType(docDestino, GcpBEDocumentoVenda), True) 
      Return True 
     Catch ex As Exception 

      MessageBox.Show(ex.Message) 
      Return False 
     End Try 

    Next 
    Return True 
End Function 

는 나에게 오류를 제공 "

내가 수정할 필요가있는 사항에 대한 의견이 있으면 오류가 사라질 수 있습니까?

고맙습니다.

+0

어떤 오류가 발생합니까? 또한, 귀하의'FileHelpersEngine'이 사용 된 곳을 볼 수 없습니다. – shamp00

+0

@ shamp00 편집 : 어떻게 MasterDetailsEngine을 사용했는지 및 오류를 보여주기 위해 편집되었습니다. –

답변

1

제네릭을 사용해보십시오. VB.NET은별로 좋지 않지만 다음과 같이 보일 것입니다 :

'declare _res as an array of MasterDetails<CabecDocVgr, LinhasDocVgr> 
Dim _res As MasterDetails(Of CabecDocVgr, LinhasDocVgr)() 

'instantiate the generic version of the FileHelpers engine 
Dim engine = New MasterDetailEngine(Of CabecDocVgr, LinhasDocVgr)(CommonSelector.MasterIfContains, "@") 

'should not cause 'late binding error' since the results are strongly typed 
_res = engine.ReadFile("") 
+0

그리고 그것이 내가 필요한 것입니다! :) 더 이상 오류가 없습니다. 한 가지 더. 나는 더 많은 클래스를 가지고 있는데, CabecX, LinhasDocX의 각 쌍에 대해 모든 코드를 반복해야합니까, 아니면 내가 잠시 필요로하는 클래스 만 사용하도록 코드를 단순화 할 수 있습니까? –

+1

올바른 FileHelpers 엔진을 생성하기위한 팩토리 메소드를 생성하여 코드 복제를 피할 수 있습니다 : 새로운'MasterDetailEngine (Of CabecDocVgr, LinhasDocVgr)'을 리턴하는'EngineFactory.Create (masterType as Type, detailType as Type)'과 같은 것. – shamp00

+1

제네릭을 사용하면 (위와 같이)'_res.Master'에는'CabecDocVgr'의 배열이 포함됩니다. 비 제네릭 버전에서는'object' 배열을 대신 포함합니다. 'late binding '오류는'object'를하려고 할 때 발생합니다 .'refDoc'. (따라서'master '를'refDoc'을 사용하기 전에 올바른 타입으로 캐스트하는 것을주의 깊게 생각했다면 여전히 원래 구현을 사용할 수 있습니다.) 그러나 제네릭을 사용하는 것이 더 깔끔합니다. – shamp00

관련 문제