我们如何检查变量是否以编程方式在项目中使用?

时间:2020-03-06 14:45:24  来源:igfitidea点击:

在VB.NET(或者C#)中,如何以编程方式确定是否在项目中的任何地方使用了helper.vb类中的公共变量?

解决方案

我们将需要使用反射,这将很复杂。

我们为什么要以编程方式执行此操作?我们知道Visual Studio具有"查找所有引用"功能可以为我们完成此操作。

查找所有推荐人是朋友。

Reflector具有分析功能。或者,这是我们需要的某种运行时功能吗?

我们是在谈论在编译代码之前执行此操作吗?尽管像Mono.Cecil这样的工具可能会有所帮助,但对编译后的程序集执行此操作可能并非易事。我们实际上必须遍历每个方法,并检查IL指令以获取对所讨论属性的get和set方法的调用。不过,实际上可能还没有那么糟糕,尤其是如果我们使用Cecil而不是System.Reflection。 Cecil还更快,因为它将程序集视为文件,而不是将其实际加载到应用程序域中。

如果要在项目的实际源代码上运行它,则情况会大不相同。我对Visual Studio加载项了解不多,但是我们可以通过编程方式调用"查找所有引用"命令并使用结果。

System.CodeDom中可能还可以提供帮助。看来我们可以使用CodeParser将代码解析为CodeCompileUnit,然后从那里遍历所有方法中的所有语句,并检查相关的CodePropertyReferenceExpression。

从MSDN

查找对象使我们可以在支持此类操作的环境(例如代码编辑器)中搜索和替换文本。

它主要用于宏录制目的。编辑器的宏记录机制使用Find而不是TextSelection.FindPattern,以便我们可以发现全局查找功能,因为与使用TextSelection Object进行文件中查找等操作相比,它通常更有用。

如果搜索操作是异步的(例如"查找全部"),则在操作完成时会发生FindDone事件。

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