In VB.NET (o C#) come è possibile determinare a livello di programmazione se una variabile pubblica in classe helper.vb viene utilizzata in qualsiasi punto all'interno di un progetto?Come si controlla se una variabile viene utilizzata in un progetto a livello di programmazione?
risposta
Da MSDN
L'oggetto Trova Consente di cercare e sostituire il testo in luoghi dell'ambiente che supportano tali operazioni, come ad esempio l'editor di codice.
È destinato principalmente alla registrazione di macro. Il meccanismo di registrazione macro dell'editor utilizza Trova piuttosto che TextSelection.FindPattern in modo che tu possa scoprire la funzionalità di ricerca globale e perché generalmente è più utile dell'utilizzo dell'oggetto TextSelection per operazioni come Find-in-file.
Se l'operazione di ricerca è asincrona, come Trova tutto, quindi l'evento FindDone si verifica quando l'operazione viene completata.
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
È necessario utilizzare la riflessione e sarebbe complicato.
Perché stai programmaticamente? Sai che Visual Studio ha una funzione "Trova tutti i riferimenti" che può farlo per te.
Trova tutte le referenze è tuo amico.
Il riflettore ha la funzione Analizza. Oppure, questa è una sorta di funzionalità di runtime che stai cercando?
Stai parlando di fare questo prima che il codice sia compilato? Fare questo contro un assembly compilato non sarebbe probabilmente banale, anche se strumenti come Mono.Cecil potrebbero aiutare. Dovresti effettivamente seguire ogni metodo e ispezionare le istruzioni IL per le chiamate ai metodi get e set della proprietà in questione. Potrebbe non essere poi così male, specialmente se hai usato Cecil invece di System.Reflection. Anche Cecil è molto più veloce, poiché tratta gli assembly come file anziché caricarli effettivamente nel dominio dell'applicazione.
Se si desidera eseguire ciò sul codice sorgente effettivo di un progetto, le cose sono molto diverse. Non so molto sui componenti aggiuntivi di Visual Studio, ma potresti essere in grado di richiamare il comando "Trova tutti i riferimenti" a livello di codice e utilizzare i risultati.
Potrebbe anche esserci qualcosa in System.CodeDom che potrebbe aiutare. Sembra che potresti utilizzare un codice per analizzare il codice in un numero CodeCompileUnit
, quindi da lì a piedi tutte le istruzioni in tutti i metodi e verificare i relativi valori CodePropertyReferenceExpression
s.
Un modo non programmatico: commentare la variabile e provare una compilazione :-) – torial