类以Dictionary为属性

时间:2018-09-28 10:31:37

标签: vb.net

我知道我在这里做的事情真的很暗,因为这是一段非常简单的代码,但是我看不到它。

我有一个具有字典类型单个属性的类。此类仅针对数据库表snd进行存储,这些表将一些值存储在dictionary属性中。麻烦的是,我在下面的代码中的LookupValues.Add行上遇到了System.NullReferenceException:

Public Class Lookup
    Private _LookupValues As Dictionary(Of Integer, String)

    Public Sub New(LookupToRetrieve As String)
        Dim sqlQuery As String
        sqlQuery = "SELECT * From LookupValues (NOLOCK) WHERE lookup_name = @LookupName"

        Using connection As New SqlConnection(My.Settings.PDFProcessorConnectionString)
            connection.Open()
            Using comm As New SqlCommand(sqlQuery, connection)
                comm.Parameters.Add("@LookupName", SqlDbType.VarChar, 20).Value = LookupToRetrieve

                Dim rs As SqlDataReader = comm.ExecuteReader
                Dim dt As New DataTable
                dt.Load(rs)

                For Each row As DataRow In dt.Rows
                    LookupValues.Add(row.Item("lookup_value"), row.Item("lookup_text"))
                Next
            End Using
        End Using
    End Sub

    Public Property LookupValues As Dictionary(Of Integer, String)
        Get
            Return _LookupValues
        End Get
        Private Set(value As Dictionary(Of Integer, String))
            _LookupValues = value
        End Set
    End Property
End Class

我只是看不到这里有什么问题-查询返回有效数据,但不会将其添加到字典中...我在做什么错了?

1 个答案:

答案 0 :(得分:1)

您永远不会创建字典。因此_LookupValues将始终为Nothing

我将LookupValues设为只读。这意味着您不能为其分配其他词典。这并不意味着字典本身是只读的。

Public ReadOnly Property LookupValues As New Dictionary(Of Integer, String)

您可以使用Visual Basic 14的ReadOnly Auto-Implemented Properties。即您无需显式声明支持字段。

这仍然有效:

LookupValues.Add(CInt(row.Item("lookup_value")), CStr(row.Item("lookup_text")))

我还建议使用Option Strict On