【问题标题】:FileHelpers Master/Detail - Option Strict On disallows late bindingFileHelpers Master/Detail - Option Strict On 不允许后期绑定
【发布时间】:2013-12-17 12:00:57
【问题描述】:

我遇到了一些问题,无法确定如何消除使用 FileHelpers 时出现的错误。

我初始化了 MasterDetails 类

Private _res As MasterDetails()

调用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

这是大师课:

<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

这个,详细介绍:

<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

每个主/明细都是创建一个带有标题和相关行的新文档。

我可以举一个错误出现的例子,当我调用 Master 或 Details 类的成员时:

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

例如,调用_res(numdoc).Master.refDoc 会出现错误:“Option Strict On 不允许后期绑定”

关于我需要修改什么以消除错误的任何想法?

谢谢

【问题讨论】:

  • 您遇到什么错误?另外,我看不到你的FileHelpersEngine 被用在了哪里。
  • @shamp00 编辑以举例说明我如何使用 MasterDetailsEngine 和错误。

标签: vb.net filehelpers option-strict


【解决方案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("")

【讨论】:

  • 这就是我所需要的! :) 没有更多的错误。还有一件事。我有更多的类,我是否需要为每对 CabecX、LinhasDocX 重复所有这些代码,或者我可以简化代码以便在某个时刻只使用我需要的类?
  • 您可以通过创建工厂方法来创建正确的 FileHelpers 引擎来避免重复代码:类似于 EngineFactory.Create(masterType as Type, detailType as Type) 将返回一个新的 MasterDetailEngine(Of CabecDocVgr, LinhasDocVgr)
  • 使用泛型(如上)意味着_res.Master 包含CabecDocVgr 的数组。对于非通用版本,它将包含一个 object 数组。当您尝试执行object.refDoc 时,会发生“后期绑定”错误。 (因此,如果您在使用 refDoc 之前始终小心地将 Master 转换为正确的类型,您仍然可以使用原始实现。但使用泛型更简洁。)
猜你喜欢
  • 2012-09-04
  • 1970-01-01
  • 2015-10-26
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多