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

使用源代码生成器时,如何让IDE将生成类导航至原始常量声明?

解决方案:通过预处理指令实现导航重定向

要解决VS Code中点击生成的StateCapitolPrompt类无法导航到原const string StateCapitol的问题,最直接且无需额外扩展的方式是利用C#的#line预处理指令,让IDE将生成类的导航指向原始定义位置。

具体步骤:

  1. 在源代码生成器中获取原始符号的位置信息
    在处理带特性的const string时,通过ISymbol.Locations属性获取该字符串所在的文件路径和起始行号。例如:

    var originalLocation = templateSymbol.Locations.First();
    var filePath = originalLocation.SourceTree.FilePath;
    var lineNumber = originalLocation.GetLineSpan().StartLinePosition.Line + 1; // 行号从1开始计数
    
  2. 在生成的类代码中插入#line指令
    在生成StateCapitolPrompt类的代码开头,添加指向原始位置的#line指令,完成后恢复默认行号映射:

    #line {lineNumber} "{filePath}"
    public class StateCapitolPrompt
    {
        // 类的实现逻辑
        public async Task<string> ExecuteAsync(string state)
        {
            // ...
        }
    }
    #line default
    

原理说明:

#line是C#官方支持的预处理指令,VS Code的C#语言服务器(基于OmniSharp/Roslyn)会识别该指令,将生成类的代码导航关联到指定的原始文件行。当用户点击StateCapitolPrompt时,IDE会直接跳转到原const string StateCapitol的定义位置。

备选方案:自定义特性+分析器扩展(进阶)

如果需要更灵活的控制,可以自定义一个特性标记生成类,例如:

[AttributeUsage(AttributeTargets.Class)]
public class RedirectToSourceAttribute : Attribute
{
    public string SourceFilePath { get; }
    public int LineNumber { get; }

    public RedirectToSourceAttribute(string sourceFilePath, int lineNumber)
    {
        SourceFilePath = sourceFilePath;
        LineNumber = lineNumber;
    }
}

然后编写一个Roslyn分析器,识别该特性并修改IDE的导航行为。但这种方式需要额外开发和部署分析器,复杂度远高于#line指令方案。

内容的提问来源于stack exchange,提问作者Charles Chen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 20:10:06