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?

È stato utile?

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 CodePropertyReferenceExpression s.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top