Come si controlla se una variabile viene utilizzata in modo programmatico in un progetto?
Domanda
In VB.NET (o C #) come posso determinare a livello di codice se una variabile pubblica nella classe helper.vb viene usata ovunque all'interno di un progetto?
Soluzione
Da MSDN
L'oggetto Trova consente di cercare e sostituire il testo in luoghi dell'ambiente che supportano tali operazioni, come l'editor di codice.
È destinato principalmente a scopi di registrazione macro. Il meccanismo di registrazione delle macro dell'editor utilizza Trova anziché TextSelection.FindPattern in modo da poter scoprire la funzionalità di ricerca globale e perché in genere è più utile che utilizzare l'oggetto TextSelection per operazioni come Trova-in-file.
Se l'operazione di ricerca è asincrona, come Trova tutto, l'evento FindDone si verifica al termine dell'operazione.
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
Altri suggerimenti
Trova tutti i riferimenti è tuo amico.
Dovresti usare la riflessione e sarebbe complicato.
Perché lo stai facendo a livello di codice? Sai che Visual Studio ha un " Trova tutti i riferimenti " caratteristica che può fare questo per te.
Reflector ha la funzione Analizza. O è questa una sorta di funzionalità di runtime che stai cercando?
Stai parlando di farlo prima che il codice sia compilato? Fare questo contro un assembly compilato probabilmente non sarebbe banale, sebbene strumenti come Mono.Cecil potrebbero aiutare . Dovresti effettivamente seguire ogni metodo e ispezionare le istruzioni IL per le chiamate per ottenere e impostare i metodi della proprietà in questione. In realtà potrebbe non essere poi così male, soprattutto se hai usato Cecil invece di System.Reflection. Cecil è anche molto più veloce, poiché tratta gli assembly come file anziché caricarli effettivamente nel dominio dell'applicazione.
Se vuoi eseguirlo sul vero codice sorgente di un progetto, le cose sono molto diverse. Non so molto sui componenti aggiuntivi di Visual Studio, ma potresti essere in grado di invocare " Trova tutti i riferimenti " comando a livello di codice e utilizzare i risultati.
Potrebbe esserci anche qualcosa in System.CodeDom che potrebbe aiutare. Sembra che tu possa usare un CodeParser
per analizzare il codice in un CodeCompileUnit
, e da lì a piedi tutte le istruzioni in tutti i metodi e controllare per