Как вы проверяете, используется ли переменная в проекте программно? - PullRequest
7 голосов
/ 26 сентября 2008

В VB.NET (или C #), как я могу программно определить, используется ли открытая переменная в классе helper.vb где-нибудь в проекте?

Ответы [ 5 ]

3 голосов
/ 26 сентября 2008

Найти все ссылки ваш друг.

2 голосов
/ 27 сентября 2008

С MSDN

Объект Find позволяет вам искать и заменять текст в местах среды, которые поддерживают такие операции, таких как редактор кода.

Он предназначен в основном для записи макросов. Механизм записи макросов в редакторе использует Find, а не TextSelection.FindPattern, так что вы можете обнаружить глобальную функциональность поиска и потому, что он, как правило, более полезен, чем использование объекта TextSelection для таких операций, как Find-in-files.

Если операция поиска является асинхронной, например «Найти все», то по окончании операции происходит событие FindDone .

Sub ActionExample()
   Dim objFind As Find = objTextDoc.DTE.Find

   ' Set the find options.
   objFind.Action = vsFindAction.vsFindActionFindAll
   objFind.Backwards = False
   objFind.FilesOfType = "*.vb"
   objFind.FindWhat = "<Variable>"
   objFind.KeepModifiedDocumentsOpen = False
   objFind.MatchCase = True
   objFind.MatchInHiddenText = True
   objFind.MatchWholeWord = True
   objFind.PatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxLiteral
   objFind.ResultsLocation = vsFindResultsLocation.vsFindResultsNone
   objFind.SearchPath = "c:\<Your>\<Project>\<Path>"
   objFind.SearchSubfolders = False
   objFind.Target = vsFindTarget.vsFindTargetCurrentDocument
   ' Perform the Find operation.
   objFind.Execute()
End Sub



<System.ContextStaticAttribute()> _
Public WithEvents FindEvents As EnvDTE.FindEvents

Public Sub FindEvents_FindDone(ByVal Result As EnvDTE.vsFindResult, _
                               ByVal Cancelled As Boolean) _
                               Handles FindEvents.FindDone
   Select Case Result 
        case vsFindResultFound
             'Found!
        case else
             'Not Found
   Ens select
End Sub
0 голосов
/ 26 сентября 2008

Вы говорите об этом до компиляции кода? Выполнение этого для скомпилированной сборки, вероятно, не будет тривиальным, хотя могут помочь такие инструменты, как Mono.Cecil . Вы должны были бы фактически пройти каждый метод и проверить инструкции IL для вызовов к методам get и set рассматриваемого свойства. Хотя это может быть не так уж и плохо, особенно если вы используете Cecil вместо System.Reflection. Сесил также намного быстрее, так как он обрабатывает сборки как файлы, а не загружает их в домен приложения.

Если вы хотите запустить это на реальном исходном коде проекта, все будет по-другому. Я не очень разбираюсь в надстройках Visual Studio, но вы можете программно вызывать команду «Найти все ссылки» и использовать результаты.

В System.CodeDom также может быть что-то, что может помочь. Похоже, вы могли бы использовать CodeParser для анализа кода в CodeCompileUnit, а затем оттуда пройти все операторы во всех методах и проверить на наличие связанных CodePropertyReferenceExpression s.

0 голосов
/ 26 сентября 2008

Отражатель имеет функцию анализа. Или это какая-то функциональность во время выполнения, к которой вы стремитесь?

0 голосов
/ 26 сентября 2008

Вам нужно будет использовать отражение, и это будет сложно.

Почему вы делаете это программно? Вы знаете, что в Visual Studio есть функция «Найти все ссылки», которая может сделать это за вас.

...