You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何实现可在编译时触发提示的自定义特性?

方案1:零成本别名替换(无需额外工具)

你可以直接用C#的类型别名功能复用ObsoleteAttribute的现有能力,只需要在用到的文件头部或者全局using文件中添加如下指令:

// 仅当前文件生效
using NotImplementedYetAttribute = System.ObsoleteAttribute;
// 如果是.NET 6+版本,放到GlobalUsings.cs中可以全局生效

使用时直接标注你想要的语义名称即可:

[NotImplementedYet("该功能尚未完成开发,调用会返回默认值", false)]
public void CalculateReport()
{
    // 待实现逻辑
}

编译时会完全复用ObsoleteAttribute的警告/错误生成逻辑,唯一的区别是编译警告的文本仍会显示“成员已过时”,如果团队内部统一了该别名的用法,完全不影响日常使用,实现成本为零。

方案2:自定义特性+Roslyn分析器(完全自定义效果)

如果你需要完全贴合语义的编译提示,推荐搭配Roslyn代码分析器实现:

  1. 首先定义自定义特性:
[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;
    }
}
  1. 实现对应的Roslyn诊断分析器,注册对成员调用的扫描逻辑:当检测到调用的成员标注了NotImplementedYetAttribute时,根据特性参数输出对应等级的编译提示,提示文本可以完全自定义为“该功能尚未实现”等符合语义的内容,效果和原生ObsoleteAttribute完全一致。分析器可以打包成Nuget包,整个团队安装后即可全局生效,后续还可以扩展更多自定义特性的校验逻辑。

内容的提问来源于stack exchange,提问作者Jean-David Lanz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 15:54:09