Как вы проверяете, используется ли переменная в проекте программно?

StackOverflow https://stackoverflow.com/questions/136829

Вопрос

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

Это было полезно?

Решение

От MSDN

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

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

Если операция поиска является асинхронной, например, Найти все, то Найддон Событие происходит, когда операция завершается.

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top