C#如何实现可在编译时触发提示的自定义特性?
方案1:零成本别名替换(无需额外工具)
你可以直接用C#的类型别名功能复用ObsoleteAttribute的现有能力,只需要在用到的文件头部或者全局using文件中添加如下指令:
// 仅当前文件生效 using NotImplementedYetAttribute = System.ObsoleteAttribute; // 如果是.NET 6+版本,放到GlobalUsings.cs中可以全局生效
使用时直接标注你想要的语义名称即可:
[NotImplementedYet("该功能尚未完成开发,调用会返回默认值", false)] public void CalculateReport() { // 待实现逻辑 }
编译时会完全复用ObsoleteAttribute的警告/错误生成逻辑,唯一的区别是编译警告的文本仍会显示“成员已过时”,如果团队内部统一了该别名的用法,完全不影响日常使用,实现成本为零。
方案2:自定义特性+Roslyn分析器(完全自定义效果)
如果你需要完全贴合语义的编译提示,推荐搭配Roslyn代码分析器实现:
- 首先定义自定义特性:
[AttributeUsage(AttributeTargets.All, Inherited = false)] public sealed class NotImplementedYetAttribute : Attribute { /// <summary> /// 自定义提示信息 /// </summary> public string Message { get; } /// <summary> /// 是否将调用标记为编译错误 /// </summary> public bool IsError { get; } public NotImplementedYetAttribute(string message = null, bool isError = false) { Message = message; IsError = isError; } }
- 实现对应的Roslyn诊断分析器,注册对成员调用的扫描逻辑:当检测到调用的成员标注了
NotImplementedYetAttribute时,根据特性参数输出对应等级的编译提示,提示文本可以完全自定义为“该功能尚未实现”等符合语义的内容,效果和原生ObsoleteAttribute完全一致。分析器可以打包成Nuget包,整个团队安装后即可全局生效,后续还可以扩展更多自定义特性的校验逻辑。
内容的提问来源于stack exchange,提问作者Jean-David Lanz
相关产品推荐
相关产品推荐

