Получите ключ объекта на Объекте коллекции

[Заполните ответ, пока кто-то другой не даст ответ, который, вероятно, будет лучше, чем этот, для последующих посетителей с похожими вопросами!]

Подводя итог, я понимаю из ответов, приведенных в комментариях:

[ 112] Это невозможно в Visual Studio 2017 каким-либо достаточно очевидным способом.

Это требует написания вашего собственного Roslyn-Analyzer (как предложено Flat Eric) или расширения Visual Studio (как предложено Chetan Ranpariya), и нет способа просто проинструктировать компилятор использовать уже существующий анализатор, который уже написан для строки. Формат.

Мы вместо этого должны либо повторить ту же работу, которую Microsoft уже проделала для string.Format, для каждой функции, имеющей аналогичные наборы параметров, либо обойтись без такого же уровня помощи в IDE. (Мне неясно, сколько именно работы Microsoft нужно повторить, и я не собираюсь искать решение, чтобы выяснить это).

JuanR также предлагает реорганизовать код на вызывающем сайте, чтобы использовать вместо него интерполяцию строк (о чем я только что узнал, читая этот комментарий, и, вероятно, стоит попробовать).

Я надеялся, что при разработке этой функции будут соблюдаться принципы DRY, так что я могу просто поручить компилятору применить известный анализатор кода к параметрам «format» и «args» моих функций, используя те же правила, что и эквивалентные параметры для string.Format, но это похоже на то, что еще не было встроено в систему.

5
задан Community 9 July 2018 в 19:34
поделиться

2 ответа

Простой подход заключается в использовании словаря вместо коллекции. Словарь по сути является ассоциативным массивом ключей, пар элементов и поддерживает поиск его ключей в виде массива. Чтобы использовать словарь, вам нужно добавить ссылку на Microsoft Scripting Runtime. Недостаток использования словаря заключается в том, что он не перечисляется так же, как коллекция. Более сложным решением было бы обернуть коллекцию и словарь для создания перечислимого словаря, как описано ниже.

NB Для правильной работы NewEnum в VBA модуль класса необходимо экспортировать и вручную отредактировать следующим образом, а затем повторно импортировать.

Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
   Set NewEnum = someKeys.[_NewEnum]
End Property

пример

Option Explicit
Private someKeys As Dictionary
Private someCols As Collection
Public Function Add(o As Object, Key As String) As Object
    someKeys.Add Key, o
    someCols.Add o, Key
End Function
Public Property Get Count() As Long
    Count = someCols.Count
End Property
Public Property Get Item(vKey As Variant) As Object
    Set Item = someCols.Item(vKey)
End Property
Public Sub Remove(vKey As Variant)
    someKeys.Remove vKey
    someCols.Remove vKey
End Sub
Public Property Get NewEnum() As IUnknown
   Set NewEnum = someCols.[_NewEnum]
End Property
Public Property Get Keys() As Variant
    Keys = someKeys.Keys
End Property
Private Sub Class_Initialize()
    Set someKeys = New Dictionary
    Set someCols = New Collection
End Sub
6
ответ дан 14 December 2019 в 04:47
поделиться

Вы можете заключить свои коллекции участников в собственный вызов коллекции, в котором хранятся ключ и коллекция. Это просто вопрос повторения итерации коллекции и запроса у элементов их ключа (то есть вашего хэша).

2
ответ дан 14 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: