在VB.Net中使用相互通信的属性

时间:2014-12-18 09:03:20

标签: vb.net function properties

我不知道标题是否真正描述了我想要达到的目标,所以请随意将其编辑为更合适/适当的标题,以便明白这一点。

我的情况是我需要能够检索数值的字符串表示,反之亦然 - 得到字符串值的数字表示。

我在helper类中有两个共享函数,如下所示:

Shared Function GetStringRepresentation(value as Integer) as String
   Select Case value
     Case 1
        Return "One"
     Case 2
        Return "Two"
   End Select
End Function

Shared Function GetNumericRepresentation(value as String) as Integer
   Select Case value
     Case "One"
        Return 1
     Case "Two"
        Return 2
   End Select
End Function

现在,在一个单独的类中,我有以下属性:

Private _stringRep As String
Public Property StringRep As String
    Get
        Return _stringRep
    End Get
    Set(value As String)
        _intRep = HelperClass.GetNumericRepresentation(value)
    End Set
End Property


Private _numericRep As Integer
Private Property NumericRep As Integer
    Get
        Return _numericRep
    End Get
    Set(value As Integer)
        _stringRep = HelperClass.GetStringRepresentation(value)
    End Set
End Property

目前这是通过默默无闻的安全。请注意,由于我无法使用多字枚举(即"THIS IS NUMBER ONE", "THIS IS NUMBER TWO"),因此我避免使用枚举。

关于如何在遵循DRY原则的同时解决这个问题的任何建议?我将枚举留给最后一个选项,enum之前的选项是SQL数据查询(因为信息来自SQL数据库);但我想尽量避免这种情况。

编辑 - 由于关于在数据库中使用代码表的两条评论,我添加了此内容,第二条是没有任何安全性。

请理解,我在数据库的代码表中有这些信息,如果添加了任何新值,这些信息将被拉入应用程序启动时的本地内存缓存中。我通过字符串值或整数值,并输入我想要的返回类型,它将返回上述返回。但是,我问在启动时是否有办法将其直接放入应用程序,并且与将数据写入本地内存缓存相比,仍然具有反编译器的某种程度的安全性。 此外,我放入的示例与我当前的代码完全无关 - 结构类似于单个对象,但代码是6-7个对象之间的交叉通信,然后通过业务层和数据访问层,在传递到数据库/从数据库中检索之前 - 将一个表连接到许多参考表(因此,我上面提到的关于安全性的评论通过默默无闻)。

我希望这能澄清我的目标。

1 个答案:

答案 0 :(得分:1)

首先,我会将所有内容存储在字典中,这样您就不会重复了。

Private _numberString As New Dictionary(Of Integer, String)

_numberString.Add(1, "One")
_numberString.Add(2, "Two")

    Shared Function GetStringRepresentation(ByVal value As Integer) As String
        If _numberString.ContainsKey(value) Then
            Return _numberString(value)
        End If
        Return ""
    End Function

    Shared Function GetNumericRepresentation(ByVal value As String) As Integer
        For Each k As Integer In _numberString.Keys
            If _numberString(k) = value Then
                Return k
            End If
        Next
        Return 0
    End Function

然后我只存储一个值,即整数。

    Private _numericRep As Integer

    Public Property StringRep() As String
        Get
            Return Helperclass.GetStringRepresentation(_numericRep)
        End Get
        Set(ByVal value As String)
            _numericRep = Helperclass.GetNumericRepresentation(value)
        End Set
    End Property

    Private Property NumericRep() As Integer
        Get
            Return _numericRep
        End Get
        Set(ByVal value As Integer)
            _numericRep = value
        End Set
    End Property

为了更进一步,我甚至不会有一个HelperClass,而是一个将在系统中缓存的查找表。特别是如果你有这些查找的多种类型。字典中的值甚至可以存储在数据库中。