1

変数を使用してコレクション内のプロパティを呼び出そうとしています。複数のプロパティがあり、情報を取得するためだけに case ステートメントを使用する必要はありません。ここにコードサンプルがあります

Sub Main()
    MessageBox("Total: " & GetNum("Total","1"))
    MessageBox("Night: " & GetNum("Night","1"))
End Sub

Private Function GetNum(ByVal pstrProp AS String, ByVal pstrNum AS String) As Double
    Dim lobjProperties as New Properties
    'this is where the issue is
    return lobjProperties."pstrProp"(pstrNum)
End Function

Public Class Properties
    Public ReadOnly Property Total(ByVal pstrNum As String) As Double
        Get
            Select Case pstrNum
                Case "1"
                    Return 48
                Case "2"
                    Return 30
                Case Else
                    Return 0
            End Select
        End Get
    End Property
    Public ReadOnly Property Night(ByVal pstrNum As String) As Double
        Get
            Select Case pstrNum
                Case "1"
                    Return 9
                Case "2"
                    Return 9
                Case Else
                    Return 0
            End Select
        End Get
    End Property
End Class

どんな考えでも大歓迎です。

4

1 に答える 1

0

実行時に呼び出すプロパティを本当に決定する必要がある場合は、リフレクションを使用するのが最善の策ですが、そのルートを使用することの欠点は、コンパイル時のチェックが失われることです。呼び出すプロパティを決定するコードがプロパティのスペルを間違えた場合はどうなりますか?実行時エラーとクラッシュ。

クラスで辞書オブジェクトを使用することもできますProperties。次のような辞書オブジェクトを設定できます。

Private m_nightValues As New Dictionary(Of String, Double)
m_nightValues("1") = 9
m_nightValues("2") = 9

プロパティで、次のNightように言います

Dim value As Double
If m_nightValues.TryGetValue(pstrNum, value) Then
    Return value
Else
    Return 0
End If

構文チェックを維持しながら、かなり動的です。

于 2012-10-31T15:13:25.140 に答える