我们如何检查变量是否以编程方式在项目中使用?
在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