Como você verificar se uma variável é usada em um projeto de programação?
Pergunta
Em VB.NET (ou C #) como posso programaticamente determinar se uma variável pública em helper.vb classe é usado em qualquer lugar dentro de um projeto?
Solução
A partir MSDN
O objeto Find permite-lhe procurar e substituir o texto em locais de meio ambiente que suportar tais operações, como o editor de código.
Destina-se principalmente para fins de gravação de macros. macro mecanismo de gravação usos do editor Encontrar em vez de TextSelection.FindPattern para que você possa descobrir a funcionalidade de localização global, e porque geralmente é mais útil do que usar o objeto TextSelection para tais operações como Find-in-arquivos.
Se a operação de busca é assíncrona, como Localizar todos, em seguida, o FindDone ocorre evento quando o conclui operação.
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
Outras dicas
Encontre todas as referências é seu amigo.
Você precisaria usar a reflexão e seria complicado.
Por que você está fazendo isso programmaticly? Você sabe que Visual Studio tem uma característica "Localizar todas as referências" que pode fazer isso por você.
refletor tem a característica Analisar. Ou, isso é algum tipo de funcionalidade tempo de execução que são depois?
Você está falando sobre como fazer isso antes que o código é compilado? Fazer isso contra um compilado assembly provavelmente não seria trivial, mas ferramentas como Mono.Cecil poderia ajudar . Você teria que realmente andar cada método e inspecionar as instruções IL para chamadas para os métodos get e set da propriedade em questão. Pode não ser realmente tão ruim, porém, especialmente se você usou Cecil vez de System.Reflection. Cecil também é muito mais rápido, como ele trata os conjuntos de arquivos em vez de realmente colocá-los no domínio de aplicativo.
Se você está querendo executar este sobre o código fonte real de um projeto de coisas são muito diferentes. Eu não sei muito sobre Visual Studio Add-Ins, mas você pode ser capaz de invocar o comando "Localizar todas as referências" programaticamente e usar os resultados.
Há também pode ser algo em System.CodeDom que poderia ajudar. Parece que você poderia usar um CodeParser
para analisar o código em um CodeCompileUnit
, e de lá a pé todas as declarações em todos os métodos e verificar se há CodePropertyReferenceExpression
s relacionados.