如何查找并标记C#解决方案中未被引用的公共属性?
符合需求的工具及现有工具功能说明
已尝试工具的功能说明
你试过的三款工具确实没有原生支持查找未引用公共属性的功能:
- RuleSet:是.NET自带的代码分析规则集合,默认规则仅覆盖代码规范、安全、性能等基础检查,无未引用成员检测规则,除非自定义规则集扩展
- CodeMaid:主打代码清理、格式化,核心功能不包含死代码检测模块
- StyleCop:仅做代码风格规范校验,完全不涉及代码引用链路分析
Resharper功能支持情况
Resharper原生支持该功能:你可以通过解决方案-wide分析开启后,未被引用的公共属性会被标记为未使用的成员,支持批量筛选导出,不过属于付费工具,不符合你偏好免费工具的需求。
可用的免费工具
- Roslynator:基于Roslyn的免费开源代码分析器,内置
RCS1047: Remove unused member规则,开启后可以直接检测未被引用的公共属性,支持Visual Studio直接安装扩展,也可以集成到CI流程中 - .NET 代码分析(自带):从.NET 5开始,你可以在项目文件中配置
<EnableNETAnalyzers>true</EnableNETAnalyzers>和<AnalysisLevel>latest-all</AnalysisLevel>,开启内置的未使用成员检测规则,自定义规则优先级后也可以检测公共未使用成员 - NDepend 免费版:免费许可额度内支持静态代码分析,可直接导出所有未被引用的成员列表,适合中大型项目使用
自行实现的方案说明
VS扩展方案可行性
你提到的开发VS扩展调用查找所有引用功能的方案完全可行,但有以下注意点:
- 要注意区分显式引用和隐式引用:比如反射调用、序列化/反序列化、ORM映射、绑定到UI的属性,都不会被VS的「查找所有引用」功能识别到,直接加
[Obsolete]特性会有误伤 - 可以调用Visual Studio SDK提供的
IVsSymbolicNavigationManager或者Roslyn的语法树、语义分析接口获取引用链路,比直接调用查找所有引用的UI接口稳定性更高
更简便的实现方案
不需要开发完整VS扩展,直接基于Roslyn写控制台工具即可,核心逻辑复杂度很低:
- 用
MSBuildWorkspace加载目标解决方案 - 遍历所有项目的语法树,筛选出所有
public属性的语法节点 - 通过语义模型获取属性对应的
ISymbol对象,调用FindReferencesAsync方法获取所有引用 - 引用数量为0的属性,修改语法树添加
[Obsolete]特性后回写文件即可
该方案不需要处理VS扩展的生命周期、UI交互等逻辑,调试和部署都更简单,还可以自定义过滤规则,比如跳过标注了[JsonProperty]/[Column]等特性的属性,避免误伤序列化、ORM场景的属性
内容的提问来源于stack exchange,提问作者inZuLiN
相关产品推荐
相关产品推荐

