确保在特定位置调用或设置字典值的优雅方法是什么?

What's the elegant way to make sure that values of dictionary are called or set in a specific location?

  Private Shared Property _dictOfCoinNameNameBasedOnMarketandSymbol As Dictionary(Of String, String)
        Get

        End Get
        Set(value As Dictionary(Of String, String))

        End Set
    End Property

通常的方法,如果不是字典,就是把变量变成属性。然后我们可以在set和get中打断点。

问题是将字典设置为 属性 会使编译器认为我需要一个 set 方法来设置字典。我想要一个设置方法来设置 属性.

中的项目

我希望能够替换

的传播事件
 _dictOfCoinNameNameBasedOnMarketandSymbol("key") = "value"

进入代码我也可以设置断点。我该怎么办?

我想我可以创建一个普通的 sub 并将所有出现的 _dictOfCoinNameNameBasedOnMarketandSymbol("key") = "value" 替换为 AssignCoinNameNameBasedOnMarketandSymbolWithKeyValue("key","value")

我写了

  Function GetCoinNameNameBasedOnMarketandSymbol(key As String) As String
        Return _dictOfCoinNameNameBasedOnMarketandSymbol(key)
    End Function
    Sub AssignCoinNameNameBasedOnMarketandSymbol(key As String, coinname As String)
        _dictOfCoinNameNameBasedOnMarketandSymbol(key) = coinname
    End Sub

然后我将手动出现所有其他 _dictOfCoinNameNameBasedOnMarketandSymbol。如果我看到 _dictOfCoinNameNameBasedOnMarketandSymbol 被分配了错误的值,我可以在 AssignCoinNameNameBasedOnMarketandSymbol 中放置断点。

这种技术的问题在于无论如何都无法自动执行它。我只需要检查代码并一个一个地替换它。

还有更优雅的方式吗?

如果 _dictOfCoinNameNameBasedOnMarketandSymbol 不是字典,则使用适当的 get 和 set 值将其更改为 属性 就可以了。我什至不需要改变任何东西。

我想我最初可能误解了这个问题。为了完整起见,我将在下面留下我原来的答案,但我会根据我的新理解在这里回答。

在我看来,您真正需要的是一个索引 属性,它将包裹 Dictionary,例如

Public Class SomeClass

    Private Shared ReadOnly valuesByKey As New Dictionary(Of String, String)

    Public Shared Property ValueByKey(key As String) As String
        Get
            Return valuesByKey(key)
        End Get
        Set
            valuesByKey(key) = Value
        End Set
    End Property

End Class

您现在可以只获取和设置 ValueByKey 属性 而永远不会直接访问 - 只读或其他方式 - class 中的 Dictionary 对象.您还可以在 getter 中的 Return 语句之前以及 setter.

中现有代码行之前或之后添加您喜欢的任何代码

原始答案:

你要的是ReadOnly属性。这正是集合在整个 .NET Framework 中的公开方式,例如Control.ControlsComboBox.ItemsDataSet.TablesDataTable.ColumnsDataTable.Rows 等。在您的情况下,它看起来像这样:

Public Shared ReadOnly Property CoinNamesByMarketAndSymbol As New Dictionary(Of String, String)

我冒昧地给 属性 起了一个合理的名字。请注意,这是一个自动 属性,即您没有明确指定 getter 或 setter。不使用 auto-属性,等效代码为:

Private Shared _coinNamesByMarketAndSymbol As New Dictionary(Of String, String)

Public Shared ReadOnly Property CoinNamesByMarketAndSymbol As Dictionary(Of String, String)
    Get
        Return _coinNamesByMarketAndSymbol
    End Get
End Property

请注意,我已声明此 属性 Public。我注意到您已声明它 Private 但这似乎没有什么意义。这样的 属性 有什么用?如果它只能在内部访问,那你为什么不直接使用字段?

使用上面的代码,您现在可以从 属性 中获取 Dictionary 来获取、添加或删除项目,但您不能替换整个 Dictionary,即您可以这个:

Dim coinName = SomeClass.CoinNamesByMarketAndSymbol(marketAndSymbol)

SomeClass.CoinNamesByMarketAndSymbol.Add(marketAndSymbol, coinName)
SomeClass.CoinNamesByMarketAndSymbol.Remove(marketAndSymbol)

但是你不能这样做:

SomeClass.CoinNamesByMarketAndSymbol = New Dictionary(Of String, String)