将值添加到另一个类类的类成员

 手机用户2502895261 发布于 2023-01-11 11:51

以下程序验证供应商文件.

以下是规则:

当时处理1供应商

验证以下3个方案(供应商发送文件,未发送文件,发送过多文件)

将验证结果存储在InvoiceFileValidationClass类中

名为"Files"的InvoiceFileValidationClass的1个类成员是"ArhiveFilesClass"类型的列表

成员"文件"需要存储多个文件名以进行存档

将值添加到InvoiceFileValidationClass的所有其他成员不是问题

向成员"Files"添加值会在以下代码行中生成null异常: ValidateFileCount.Files.Add(temp)

关于如何避免null异常的任何想法?

    Public Class InvoiceFileValidationClass
        Public VendorName As String
        Public FileName As String
        Public FileCount As InvoiceFileCount
        Public FileContent As InvoiceFileContent
        Public ErrorMessage As String
        Public Files As List(Of ArhiveFilesClass)
    End Class
    Public Class ArhiveFilesClass
        Public OriginalFilePathandName As String
        Public ArchiveFilePathandName As String
    End Class
Public Enum InvoiceFileCount
    FileMissing
    PassedValidation
    TooManyFiles
End Enum

Public Shared Function ValidateFileContent(Vendor As VendorClass) As InvoiceFileValidationClass
        ValidateFileContent = New InvoiceFileValidationClass
        ValidateFileContent.FileContent = InvoiceFileContent.PassedValidation
        Dim MyUnzippedFolder As DirectoryInfo = New DirectoryInfo(Vendor.FTPInPath)
        Dim LineNumber As Integer = 0
        Dim ErrorLine As String = Nothing
        For Each VendorFile In MyUnzippedFolder.GetFiles()
            If InStr(VendorFile.Name.ToString, Vendor.InvoiceFileMask) <> 0 Then 'match mask
                If File.Exists(VendorFile.FullName) Then
                    REM
                    REM Check File Name Extension
                    REM
                    If VendorFile.Extension.ToUpper <> ".CSV" Then
                        ValidateFileContent.ErrorMessage = Vendor.VendorName & ": did not provide a csv file."
                        ValidateFileContent.FileContent = InvoiceFileContent.NotCSVFile
                    End If

                    REM
                    REM Check Column Count Per Row 
                    REM
                    Using reader As New StreamReader(VendorFile.FullName)
                        Dim line As String = reader.ReadLine()
                        While line IsNot Nothing
                            Dim temp As New InvoiceTextFileClass
                            Dim fields() As String = line.Split(",".ToCharArray())
                            If LineNumber > 0 Then 'Do Not Analyze, this is the column header
                                If fields.Length <> Vendor.ExpectedColumnCount Then
                                    ValidateFileContent.FileContent = InvoiceFileContent.IntegrityCheckFailed
                                    ErrorLine = ErrorLine & LineNumber.ToString & ", "
                                End If
                            End If
                            line = reader.ReadLine()
                            LineNumber += 1
                        End While
                    End Using
                End If
            End If
        Next
        If ErrorLine <> Nothing Then
            ValidateFileContent.ErrorMessage = Vendor.VendorName & ": integrity check failed in the following rows (" & ErrorLine & ")."
        End If

        REM
        REM Check File Row Count
        REM
        If LineNumber < 2 Then
            ValidateFileContent.ErrorMessage = Vendor.VendorName & ": empty file."
            ValidateFileContent.FileContent = InvoiceFileContent.FileIsEmpty
        End If
    End Function

Ben Black.. 7

这是一个重申我们评论的例子

Module Module1

    Sub Main()

        Dim test As New TestingSomethingHere    
        test.Files.Add("test") '' THIS WORKS!!!! BECAUSE FILES HAS BEEN INITIALIZED!!!

        Dim test2 As New TestingSomethingElseHere    
        test2.Files.Add("test2") '' THIS DOESN'T WORK!! BECAUSE FILES HASN'T BEEN INITIALIZED!!!

    End Sub

    Public Class TestingSomethingHere    
        Public Files As New List(Of String)    
    End Class

    Public Class TestingSomethingElseHere    
        Public Files As List(Of String)    
    End Class

End Module

请注意,在我的TestingSomethingHere课程中,我New在声明时使用了关键字Files.这告诉它每当构造该类时,它会自动初始化该成员.(你没有这个)

在我的TestingSomethingElseHere课堂上,我不使用它(就像你一样),当我尝试在集合中添加一些东西时,我得到了一个NullReferenceException.这是因为Files 尚未初始化.

有很多方法可以初始化它,但关键是你必须初始化它


要完全拼出来,这是你的班级:

Public Class InvoiceFileValidationClass
    Public VendorName As String
    Public FileName As String
    Public FileCount As InvoiceFileCount
    Public FileContent As InvoiceFileContent
    Public ErrorMessage As String
    Public Files As List(Of ArhiveFilesClass)
End Class

这就是你需要的.

Public Class InvoiceFileValidationClass
    Public VendorName As String
    Public FileName As String
    Public FileCount As InvoiceFileCount
    Public FileContent As InvoiceFileContent
    Public ErrorMessage As String
    Public Files As New List(Of ArhiveFilesClass)
End Class

变化是

Public Files As List(Of ArhiveFilesClass)

改为

Public Files As New List(Of ArhiveFilesClass)

这是在.NET中初始化需要它的对象的一种方法

1 个回答
  • 这是一个重申我们评论的例子

    Module Module1
    
        Sub Main()
    
            Dim test As New TestingSomethingHere    
            test.Files.Add("test") '' THIS WORKS!!!! BECAUSE FILES HAS BEEN INITIALIZED!!!
    
            Dim test2 As New TestingSomethingElseHere    
            test2.Files.Add("test2") '' THIS DOESN'T WORK!! BECAUSE FILES HASN'T BEEN INITIALIZED!!!
    
        End Sub
    
        Public Class TestingSomethingHere    
            Public Files As New List(Of String)    
        End Class
    
        Public Class TestingSomethingElseHere    
            Public Files As List(Of String)    
        End Class
    
    End Module
    

    请注意,在我的TestingSomethingHere课程中,我New在声明时使用了关键字Files.这告诉它每当构造该类时,它会自动初始化该成员.(你没有这个)

    在我的TestingSomethingElseHere课堂上,我不使用它(就像你一样),当我尝试在集合中添加一些东西时,我得到了一个NullReferenceException.这是因为Files 尚未初始化.

    有很多方法可以初始化它,但关键是你必须初始化它


    要完全拼出来,这是你的班级:

    Public Class InvoiceFileValidationClass
        Public VendorName As String
        Public FileName As String
        Public FileCount As InvoiceFileCount
        Public FileContent As InvoiceFileContent
        Public ErrorMessage As String
        Public Files As List(Of ArhiveFilesClass)
    End Class
    

    这就是你需要的.

    Public Class InvoiceFileValidationClass
        Public VendorName As String
        Public FileName As String
        Public FileCount As InvoiceFileCount
        Public FileContent As InvoiceFileContent
        Public ErrorMessage As String
        Public Files As New List(Of ArhiveFilesClass)
    End Class
    

    变化是

    Public Files As List(Of ArhiveFilesClass)
    

    改为

    Public Files As New List(Of ArhiveFilesClass)
    

    这是在.NET中初始化需要它的对象的一种方法

    2023-01-11 11:53 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有